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

SwiftUI:如何在ScrollView中同时监听拖拽手势位置并允许滚动?

解决ScrollView与自定义拖拽手势共存的问题

你遇到的核心问题是ScrollView自带的滚动手势优先级高于自定义DragGesture,系统会优先响应滚动操作,导致垂直拖拽时你的自定义手势回调被拦截。

直接把原来的.gesture()换成.simultaneousGesture()就能实现两者共存,这个修饰符允许视图的原生手势和你的自定义手势同时被识别:

ScrollView {
    VStack(alignment: .center, spacing: 0) {
        ForEach((0..<reports.count), id: \.self) {i in
            Component(report: reports[i])
                .offset(y: -(CGFloat(i) * 12.0))
        }
    }
}
.simultaneousGesture(
    DragGesture()
        .onChanged { value in
            self.position = value.translation
            print(self.position)
        }
        .onEnded { _ in
            self.position = .zero
        }
)

如果之后需要针对水平/垂直拖拽做不同逻辑,还可以在onChanged里通过value.translation的x、y分量判断拖拽方向,比如:

.onChanged { value in
    let translation = value.translation
    // 判断是否为垂直滚动方向
    if abs(translation.y) > abs(translation.x) {
        // 处理滚动相关逻辑
    } else {
        // 处理水平拖拽逻辑
    }
    self.position = translation
    print(self.position)
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 22:55:56