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

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的.presentationDetents modifier添加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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 02:39:53