SwiftUI中如何获取视图的初始触摸位置?
获取SwiftUI视图的初始触摸位置
你不需要额外引入TapGesture或LongPressGesture,DragGesture本身就内置了获取初始触摸位置的能力,通过其回调参数的startLocation属性就能直接拿到触摸起始点的坐标。
下面是修改后的代码,演示如何捕获并显示初始触摸位置:
struct ContentView: View { @GestureState var dragAmount = CGSize.zero @State private var initialTouchLocation: CGPoint? // 用于存储初始触摸坐标 var dragGesture: some Gesture { DragGesture() .updating($dragAmount) { currentState, gestureState, transaction in gestureState = currentState.translation // 首次触发拖动时记录初始位置 if initialTouchLocation == nil { initialTouchLocation = currentState.startLocation } } .onEnded { _ in // 触摸结束后重置,确保下次触摸能重新记录 initialTouchLocation = nil } } var body: some View { ZStack { Circle() .foregroundStyle(.blue) .gesture(dragGesture) VStack(spacing: 8) { Text("拖动偏移: \(dragAmount.debugDescription)") if let initialLoc = initialTouchLocation { Text("初始位置: \(initialLoc.debugDescription)") } } .foregroundStyle(.white) } .padding() } }
关键说明:
- 新增
@State private var initialTouchLocation: CGPoint?来保存初始位置,使用可选类型是为了在触摸结束后清空,避免残留上一次的位置数据。 - 在
updating回调中,当initialTouchLocation为空时,通过currentState.startLocation获取触摸起始坐标并赋值,这个属性是DragGesture自带的,专门记录触摸开始时的点。 - 在
onEnded回调中重置initialTouchLocation,保证每次新的触摸都能正确记录初始位置。
你也可以选择在onChanged回调中完成初始位置的记录,效果完全一致:
var dragGesture: some Gesture { DragGesture() .updating($dragAmount) { currentState, gestureState, transaction in gestureState = currentState.translation } .onChanged { value in if initialTouchLocation == nil { initialTouchLocation = value.startLocation } } .onEnded { _ in initialTouchLocation = nil } }
内容的提问来源于stack exchange,提问作者Berry Blue
相关产品推荐
相关产品推荐

