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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 05:35:16