Apple 终于在 2021 年的 iOS 15 中发布了一个Apple Maps-style“bottom sheet”控件:UISheetPresentationController.
这种类型的床单本身支持“制动器”,床单自然放置的高度。默认的
large()
制动器代表全屏演示文稿,而 medium()
制动器覆盖大约一半的屏幕。
但是API里面没有
small()
的detent。
Apple Maps 和类似的应用程序通常会在屏幕底部显示一个完全折叠的小表格,可以将其拖动到半高,也可以将其拖动到全屏。苹果地图实际上显示了 1/3 高度的屏幕,这似乎与
medium()
制动器不同。
使用
UISheetPresentationController
,not 任何底部表单的第 3 方重新实现,表单如何在屏幕底部呈现 Apple Maps 样式的折叠小制动器?
适用于 iOS 16+
Swift - 自定义(标识符:解析器:)
对于 iOS 15:使用
+[UISheetPresentationControllerDetent _detentWithIdentifier:constant:]
.
是私有方法
Summary: UIKitCore`+[UISheetPresentationControllerDetent _detentWithIdentifier:constant:] Address: UIKitCore[0x00000001838d50fc] (UIKitCore.__TEXT.__text + 17876312)
我提交雷达请求支持。我建议其他任何想看到这个的人也这样做。实际上,中型和大型不会削减它,如果在 iOS 15 发布之前没有添加第三方库,我们将仍然依赖第三方库。
在 UIKit 中 - iOS 16+ 分数定位器可以这样实现:
viewControllerToShow.modalPresentationStyle = .formSheet
let sheet = viewControllerToShow.sheetPresentationController
let multiplier = 0.25
let fraction = UISheetPresentationController.Detent.custom { context in
// height is the view.frame.height of the view controller which presents this bottom sheet
height * multiplier
}
sheet?.detents = [fraction]
SwiftUI - iOS 16+
您可以使用类似的东西添加自己的自定义制动器尺寸:
.sheet(isPresented: $showSheet) {
YourView()
.presentationDetents([.large, .medium, .fraction(0.25)]) //Fraction 0.25 means the sheet will be sized 25% of the whole screen.
}
id detent = [UISheetPresentationControllerDetent customDetentWithIdentifier:UISheetPresentationControllerDetentIdentifierLarge
resolver:^CGFloat(id<UISheetPresentationControllerDetentResolutionContext> _Nonnull context) {
return 150;
}];