SwiftUI实现类Apple Maps带ScrollView的Sheet拖拽交互问题
SwiftUI Sheet 拖拽交互冲突问题(含TabView场景)
需求与初始问题
- 需要创建支持三种展示尺寸的Sheet,使用的PresentationDetents类型为:
[.fraction(0.2), .medium, .large],希望能自由切换到这三个尺寸 - 当Sheet内部用ScrollView展示大段文本时,向下拖拽操作会被ScrollView拦截触发滚动,无法触发Sheet的尺寸调整或关闭操作
已尝试的方案及问题
- 基于UIKit的UIScrollView重构ScrollView,当
contentOffset < 0时禁止滚动:该方案能实现拖拽关闭Sheet,但导致ScrollView无法正常向下滚动内容 - 给Sheet的
.presentationDetentsmodifier添加selection绑定:可切换到.fraction(0.2)尺寸,但Sheet会出现短暂上下跳动的视觉bug
期望效果
实现类似Apple Maps的交互逻辑:当ScrollView内容处于顶部位置时,向下拖拽可触发Sheet的尺寸调整或关闭;当ScrollView内容不在顶部时,拖拽操作正常触发ScrollView滚动
更新:问题根源定位
此前Durul Dalkanat提供的方案原本有效,但因未提及Sheet内使用了TabView,现在确认是TabView而非ScrollView阻碍了拖拽交互,示例代码如下:
.sheet(isPresented: $isSheetPresented) { TabView { ForEach(0..<5, id: \.self) { i in ScrollView { // 内容区域 } } } .tabViewStyle(PageTabViewStyle(indexDisplayMode: .always)) }
内容的提问来源于stack exchange,提问作者yama_HD
相关产品推荐
相关产品推荐

