如何在UIKit中实现类似SwiftUI的自定义比例Bottom Sheet Detents?
在UIKit中实现自定义比例的Bottom Sheet Detent
在UIKit里,你可以通过UISheetPresentationController.Detent.custom方法创建自定义比例的底部弹窗detent,效果和SwiftUI的.fraction()一致,具体实现如下:
代码示例
if let sheet = viewControllerToPresent.sheetPresentationController { // 创建占屏幕高度10%的自定义detent let customFractionDetent = UISheetPresentationController.Detent.custom(identifier: .init("customFraction_0.1")) { context in // context.maximumDetentValue对应large detent的高度,即屏幕可用高度最大值 return context.maximumDetentValue * 0.1 } // 设置弹窗的detents数组,可同时添加多个detent(比如自定义比例+medium) sheet.detents = [customFractionDetent] }
关键说明
- 自定义标识符:
.custom需要传入唯一的identifier,用于系统识别这个自定义detent,避免和其他detent冲突 - 比例计算逻辑:闭包中的
context.maximumDetentValue是当前屏幕下弹窗能达到的最大高度(也就是large detent的高度),乘以你需要的比例值,就能实现和SwiftUI.fraction(0.1)完全一致的效果 - 多detent支持:如果需要同时提供多个弹窗高度选项,直接把多个detent对象加入
detents数组即可,比如[customFractionDetent, .medium()]
版本要求
该API仅支持iOS 16及以上版本,如果需要兼容更低版本,需要手动实现弹窗高度的控制逻辑,但iOS 16+推荐使用官方提供的自定义detent方案。
内容的提问来源于stack exchange,提问作者Rock
相关产品推荐
相关产品推荐

