SwiftUI高优先级手势如何获取触摸位置?普通Tap手势为何可返回CGPoint
解决SwiftUI高优先级手势无法获取触摸位置的问题
为什么普通Tap修饰符能拿到位置,高优先级手势不行?
- 普通的
.tapGesture(onEnded:)是视图级修饰符,它的闭包参数是系统自动传入的触摸位置CGPoint,这是该修饰符的封装特性。 - 而
TapGesture()是独立的手势结构体,它的onEnded闭包没有位置参数——不管把它放到.highPriorityGesture还是.gesture里,都拿不到位置,和高优先级本身无关。
如何在高优先级手势中获取触摸位置?
用DragGesture(minimumDistance: 0)替代TapGesture,因为DragGesture可以捕获触摸位置,设置minimumDistance: 0后,它会在触摸结束时触发,效果和Tap一致:
.highPriorityGesture( DragGesture(minimumDistance: 0) .onEnded { value in let touchLocation = value.location print("触摸位置:\(touchLocation.x), \(touchLocation.y)") } )
- 若需要区分Tap和长按,可结合
updating方法或设置maximumDistance限制拖拽范围,确保只有点击动作触发。 - 也可以通过
GestureState实时跟踪触摸位置,但对于Tap场景,直接用DragGesture的onEnded获取最终位置更简洁。
内容的提问来源于stack exchange,提问作者Ahmed Zaidan
相关产品推荐
相关产品推荐

