【Lebus的iOS开发教程】iOS16+SwiftUI4.0新功能实操演示-Bottom Sheet

1,139 阅读2分钟

Bottom Sheet-可自定义大小的弹框

先看效果:

从底部出来的modally弹框,可以只让他弹出部分---这个功能在很多App里面非常常见

在iOS15的时候,苹果已经在UIKit里面开放了这个功能(UISheetPresentationController),iOS16的时候,在SwiftUI里也提供了这样的接口 image.png 代码:

struct ContentView: View {
    @State private var showSheet = false
    var body: some View {
        VStack {
            Button("展示Lebus的课程") {
                showSheet.toggle()
            }
            .buttonStyle(.borderedProminent)
            .sheet(isPresented: $showSheet) {
                Text("iOS开发-SwiftUI最新版")
                    .presentationDetents([.medium,.large]) //关注这个修饰符
            }
            Spacer()
        }
    }
}

presentationDetents修饰符需要一个Set类型的参数(跟数组差不多),上面的代码放了.medium和.large,表明用户可以让弹框在一半和最大之间切换,大家可以试着拖拽弹框看效果。

所以,如果只放一个参数,比如medium的话,就只弹出一半,用户拖拽的话就只能关闭。

presentationDragIndicator

可继续加上.presentationDragIndicator(.visible)修饰符,让弹框上方的指示条强制消失或显示,现实开发中还是显示用的比较多。

默认是automatic,这是SwiftUI的老套路了,会根据不同设备或不同设置等自动适配。在iOS设备里面,presentationDetents的参数里面只有一个medium或large的时候,是不会显示这个指示条的,这个时候想显示的话就必须明确指定为visible,如下:

image.png

fraction和height

除了内置的medium和large参数,也可以具体的指定弹出框弹出的比例和高度

.presentationDetents([.fraction(0.9)]) //弹出框弹出90%
.presentationDetents([.height(300)]) //弹出300高度
高级用法

还可以自定义presentationDetents里面的Set类型的参数,让弹出框在某个范围内每隔多少滑动(差不多就是把上面的[.medium,.large]参数更加细分了),这个感觉用得不多,如有需要到时候再更上来。