如何检测SwiftUI中序列手势的第二个手势是否失败或未启动?
检测序列手势中第二个手势的状态
可以通过状态变量结合手势回调追踪整个序列的执行阶段,以此判断第二个手势是未启动还是已失败。
实现思路
- 定义状态变量记录手势执行阶段,比如
.idle(空闲)、.longPressCompleted(长按完成,等待拖动)、.dragStarted(拖动开始)。 - 在长按手势的
onEnded中标记阶段为长按完成,此时拖动手势处于待触发状态。 - 利用视图的
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
相关产品推荐
相关产品推荐

