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

如何禁用SwiftUI Sheet上滑放大效果?固定Sheet尺寸

解决SwiftUI Sheet拖动超出设定Detent的问题

你遇到的是Sheet默认的弹性拖动行为——即使只设置了单一高度的detent,系统仍允许轻微拖动超出。可以通过修改UIKit底层的UISheetPresentationController属性来禁用这个效果。

步骤1:修正代码语法错误

你原代码里的presentationDetents[.height(200)]写法有误,正确应该使用括号:

SomeView()
    .sheet(isPresented: $isPresented) {
        // Sheet内容视图
    }
    .presentationDetents([.height(200)])

步骤2:禁用弹性扩展效果

在Sheet的内容视图中添加onAppear修饰符,获取底层控制器并关闭滚动扩展开关:

SomeView()
    .sheet(isPresented: $isPresented) {
        SheetContentView()
            .onAppear {
                guard let sheetController = UIApplication.shared.windows.first?.rootViewController?.presentedViewController as? UISheetPresentationController else {
                    return
                }
                // 禁用拖动超出detent的弹性扩展
                sheetController.prefersScrollingExpandsWhenScrolledToEdge = false
                // 可选:如果想禁止用户向下拖动关闭Sheet,添加下面一行
                // sheetController.presentingViewController?.isModalInPresentation = true
            }
    }
    .presentationDetents([.height(200)])

可选:封装成复用扩展

如果需要在多个Sheet中使用,可以封装成View扩展:

extension View {
    func disableSheetEdgeExpansion() -> some View {
        self.onAppear {
            guard let sheet = UIApplication.shared.windows.first?.rootViewController?.presentedViewController as? UISheetPresentationController else {
                return
            }
            sheet.prefersScrollingExpandsWhenScrolledToEdge = false
        }
    }
}

使用时直接在Sheet内容视图上调用:

SheetContentView()
    .disableSheetEdgeExpansion()

注意事项

  • 该方案仅适用于iOS 16及以上,因为presentationDetents和prefersScrollingExpandsWhenScrolledToEdge都是iOS 16引入的API。
  • 如果Sheet内容包含ScrollView,上述设置已经覆盖了滚动触发的扩展情况。

内容的提问来源于stack exchange,提问作者Nicolas Gimelli

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 17:42:17