SwiftUI自定义弹出的Sheet的尺寸
SwiftUI自定义弹出的Sheet的尺寸

SwiftUI自定义弹出的Sheet的尺寸

在 SwiftUI 中,presentationDetents 是用于自定义弹出的 Sheet 的尺寸的修饰符。通过这个修饰符,可以指定 Sheet 的高度,并允许用户在不同高度之间切换。

基础语法

.sheet(isPresented: $isPresented) {
    Text("This is a sheet")
        .presentationDetents([.medium, .large])
}

.presentationDetents([.medium, .large]): 设置弹出的 Sheet 可以在 中等高度全屏高度 之间切换。

.medium 和 .large 是预定义的高度类型。

可用的 Detent 类型

1、预定义高度

.fraction(Double):以屏幕高度的百分比定义弹窗高度(例如,.fraction(0.5) 表示 50% 的屏幕高度)。

.height(CGFloat):使用绝对值指定高度(例如,.height(300) 表示弹窗高度为 300 点)。

.medium:表示一个系统定义的中等高度。

.large:表示弹窗填充整个屏幕高度。

2、自定义高度

如果预定义的高度无法满足需求,可以使用 .fraction 或 .height 进行更细粒度的控制。

完整示例

使用系统预定义高度

struct ContentView: View {
    @State private var isSheetPresented = false
    
    var body: some View {
        Button("Show Sheet") {
            isSheetPresented = true
        }
        .sheet(isPresented: $isSheetPresented) {
            VStack {
                Text("This is a sheet")
                    .font(.title)
                Text("Swipe to resize")
            }
            .presentationDetents([.medium, .large])
        }
    }
}

使用自定义高度

struct ContentView: View {
    @State private var isSheetPresented = false
    
    var body: some View {
        Button("Show Custom Sheet") {
            isSheetPresented = true
        }
        .sheet(isPresented: $isSheetPresented) {
            VStack {
                Text("Custom Height Sheet")
                    .font(.title)
            }
            .presentationDetents([.height(200), .fraction(0.7)])
        }
    }
}

指定初始高度

可以使用 presentationDetents 的 Set 来指定多个高度,并使用 .presentationDragIndicator 控制是否显示拖动指示器。

设置初始高度

.presentationDetents([.medium, .large], selection: $selectedDetent)

$selectedDetent 是一个绑定值,用于指定当前的高度。

示例

struct ContentView: View {
    @State private var selectedDetent: PresentationDetent = .medium
    @State private var isSheetPresented = false
    var body: some View {
        Button("Show Custom Sheet") {
            isSheetPresented = true
        }
        .sheet(isPresented: $isSheetPresented) {
            VStack {
                Text("Sheet with Initial Size")
            }
            .presentationDetents([.medium, .large], selection: $selectedDetent)
        }
    }
}

拖动指示器

.presentationDragIndicator(.visible) // 默认值,显示拖动指示器
.presentationDragIndicator(.hidden) // 隐藏拖动指示器

如果presentationDetents中只有一个值,默认也会因此拖动指示器:

.presentationDetents([.medium], selection: $selectedDetent)

适用平台

iOS 16+

iPadOS 16+

macOS 13+

总结

presentationDetents 是 SwiftUI 中一个强大且灵活的 API,可以实现多种弹窗高度和交互方式。通过结合 Set 和 PresentationDetent 类型,可以轻松创建符合设计需求的自定义 Sheet。

如果您认为这篇文章给您带来了帮助,您可以在此通过支付宝或者微信打赏网站开放者。

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注