iOS开发:为Bottom Sheet添加关闭按钮后Medium Detent异常变为Large Detent的问题求助
问题原因与解决方案
我一眼就看出问题出在哪了——你找错了要配置的sheetPresentationController对象!
核心问题
你当前的代码是给MySheetController实例(updateController)设置sheet相关参数,但实际上你最终present的是包裹它的UINavigationController。iOS中,只有被直接调用present(_:animated:completion:)的控制器,它的sheetPresentationController才会生效,内部子控制器的这个属性是无效的。所以你之前设置的.medium() detent根本没被应用,sheet自然会使用默认的.large()状态。
修正后的代码
把触发Sheet展示的代码改成这样:
@objc func showTheSheet() { let updateController = MySheetController() let navController = UINavigationController(rootViewController: updateController) // 这里改成获取导航控制器的sheetPresentationController if let sheet = navController.sheetPresentationController { sheet.detents = [.medium()] sheet.largestUndimmedDetentIdentifier = nil sheet.prefersGrabberVisible = true sheet.prefersScrollingExpandsWhenScrolledToEdge = true sheet.prefersEdgeAttachedInCompactHeight = true sheet.widthFollowsPreferredContentSizeWhenEdgeAttached = true } self.present(navController, animated: true, completion: nil) }
额外说明
- 你在
SheetController中添加导航栏关闭按钮的代码是没问题的,不需要修改。 - 如果后续需要调整detent(比如支持多种尺寸),依然要确保是给被present的那个顶层控制器(这里就是导航控制器)的
sheetPresentationController做配置。
内容的提问来源于stack exchange,提问作者angryip
相关产品推荐
相关产品推荐

