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

如何检测SwiftUI中序列手势的第二个手势是否失败或未启动?

检测序列手势中第二个手势的状态

可以通过状态变量结合手势回调追踪整个序列的执行阶段,以此判断第二个手势是未启动还是已失败。

实现思路

  1. 定义状态变量记录手势执行阶段,比如.idle(空闲)、.longPressCompleted(长按完成,等待拖动)、.dragStarted(拖动开始)。
  2. 在长按手势的onEnded中标记阶段为长按完成,此时拖动手势处于待触发状态。
  3. 利用视图的onTapGesture辅助判断:长按完成后直接抬手会触发轻击,结合当前状态即可判定拖动手势未启动/失败;若进入拖动则更新状态,避免触发轻击判断。

代码示例

struct ContentView: View {
    enum GesturePhase {
        case idle
        case longPressCompleted
        case dragStarted
    }
    
    @State private var gesturePhase: GesturePhase = .idle
    
    var body: some View {
        Rectangle()
            .fill(.blue)
            .frame(width: 200, height: 200)
            .gesture(
                LongPressGesture()
                    .onEnded { _ in
                        gesturePhase = .longPressCompleted
                        print("长按完成,等待拖动")
                    }
                    .sequenced(before: DragGesture()
                        .onChanged { _ in
                            gesturePhase = .dragStarted
                            print("拖动已启动")
                        }
                        .onEnded { _ in
                            print("拖动完成")
                            gesturePhase = .idle
                        }
                    )
                    .onEnded { _ in
                        print("整个手势序列完成")
                        gesturePhase = .idle
                    }
            )
            .onTapGesture {
                if gesturePhase == .longPressCompleted {
                    print("拖动手势未启动/已失败(长按后直接抬手)")
                    gesturePhase = .idle
                }
            }
    }
}

逻辑说明

  • 长按完成后状态变为.longPressCompleted,若用户直接抬手会触发onTapGesture,结合状态即可判断拖动手势未启动。
  • 若用户在长按后开始拖动,DragGesture的onChanged会更新状态为.dragStarted,此时不会触发轻击判断。
  • 所有手势流程结束后重置状态为.idle,避免干扰下一次手势检测。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 16:42:07