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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 13:10:37