SwiftUI中如何检测长按手势的触发与松开时机?
解决SwiftUI中LongPressGesture同时检测长按达标与屏幕松开的问题
要同时实现检测长按满1秒的时刻和用户任意时刻松开屏幕的操作,你可以通过组合LongPressGesture与DragGesture(最小触摸距离设为0),让两个手势同时生效来实现需求。
实现思路
LongPressGesture(minimumDuration: 1.0)的onEnded:精准捕获用户按住屏幕满1秒的动作。DragGesture(minimumDistance: 0)的onEnded:捕获用户任何时候松开屏幕的操作(包括长按未满1秒就松开的场景)。
完整代码示例
struct ContentView: View { // 标记是否触发过长按达标逻辑,避免重复执行 @State private var didCompleteLongPress = false var body: some View { Color.blue .simultaneousGesture( // 检测长按满1秒的动作 LongPressGesture(minimumDuration: 1.0) .onEnded { _ in didCompleteLongPress = true UIImpactFeedbackGenerator(style: .light).impactOccurred() print("长按满1秒触发") } ) .simultaneousGesture( // 检测所有松开屏幕的操作 DragGesture(minimumDistance: 0) .onEnded { _ in if didCompleteLongPress { print("长按达标后松开屏幕") } else { print("长按未满1秒就松开屏幕") } // 重置标记,为下一次手势做准备 didCompleteLongPress = false } ) } }
代码说明
- 状态标记
didCompleteLongPress:用来区分用户是长按达标后松开,还是未满1秒就松开,避免重复执行反馈或业务逻辑。 LongPressGesture:仅在用户按住满1秒时触发onEnded,此时将标记设为true。DragGesture(minimumDistance: 0):因为最小触摸距离设为0,只要用户触摸后松开就会触发onEnded,在这里根据标记判断松开场景,执行对应逻辑后重置标记。
这样就能同时满足你的两个需求:既可以检测长按满1秒的时刻,也能捕获所有用户松开屏幕的操作。
内容的提问来源于stack exchange,提问作者Ahmed Zaidan
相关产品推荐
相关产品推荐

