You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.28 16:22:38