Bottom Sheet-可自定义大小的弹框
先看效果:
从底部出来的modally弹框,可以只让他弹出部分---这个功能在很多App里面非常常见
在iOS15的时候,苹果已经在UIKit里面开放了这个功能(UISheetPresentationController),iOS16的时候,在SwiftUI里也提供了这样的接口
代码:
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,如下:
fraction和height
除了内置的medium和large参数,也可以具体的指定弹出框弹出的比例和高度
.presentationDetents([.fraction(0.9)]) //弹出框弹出90%
.presentationDetents([.height(300)]) //弹出300高度
高级用法
还可以自定义presentationDetents里面的Set类型的参数,让弹出框在某个范围内每隔多少滑动(差不多就是把上面的[.medium,.large]参数更加细分了),这个感觉用得不多,如有需要到时候再更上来。