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
相关产品推荐
相关产品推荐

