iOS 16:如何为UISheetPresentationController设置最小停靠高度?
在iOS 16的UISheetPresentationController API中能否设置Sheet的最小停靠高度?
可以设置。iOS 16扩展的UISheetPresentationController支持通过自定义停靠档位(detent)来指定最小停靠高度,避免sheet被拖至屏幕外消失。系统预设的.medium()、.large()档位无法直接定义具体高度,需要使用.custom()方法创建自定义档位。
修改你提供的示例代码如下:
let viewControllerToPresent = UIViewController() if let sheet = viewControllerToPresent.sheetPresentationController { // 自定义最小停靠高度,此处设置为200pt(可按需调整) let minDetent = UISheetPresentationController.Detent.custom(identifier: .init("minimumHeight")) { context in // 也可结合context动态计算高度,例如取屏幕最大可用高度的20%: // return context.maximumDetentValue * 0.2 return 200 } // 将自定义档位放在数组首位,作为最低停靠位置 sheet.detents = [minDetent, .medium(), .large()] // 可选:设置最小档位下背景不模糊 sheet.largestUndimmedDetentIdentifier = .init("minimumHeight") sheet.prefersScrollingExpandsWhenScrolledToEdge = false sheet.prefersEdgeAttachedInCompactHeight = true sheet.widthFollowsPreferredContentSizeWhenEdgeAttached = true } present(viewControllerToPresent, animated: true, completion: nil)
关键说明:
- 自定义档位需通过
custom(identifier:handler:)创建,identifier用于标记档位,方便后续配置(如设置不模糊档位) - 闭包中的
context参数可获取屏幕环境信息:context.maximumDetentValue:当前sheet可达到的最大高度context.safeAreaInsets:屏幕安全区域边距,可用于适配刘海、底部导航栏,避免内容被遮挡
- 将自定义档位放在
detents数组的第一个位置,它就会成为sheet的最低停靠档位,用户无法将sheet拖至该高度以下
内容的提问来源于stack exchange,提问作者Jake Chasan
相关产品推荐
相关产品推荐

