如何禁用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
相关产品推荐
相关产品推荐

