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

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
                    }
            )
    }
}

代码说明

  1. 状态标记didCompleteLongPress:用来区分用户是长按达标后松开,还是未满1秒就松开,避免重复执行反馈或业务逻辑。
  2. LongPressGesture:仅在用户按住满1秒时触发onEnded,此时将标记设为true。
  3. DragGesture(minimumDistance: 0):因为最小触摸距离设为0,只要用户触摸后松开就会触发onEnded,在这里根据标记判断松开场景,执行对应逻辑后重置标记。

这样就能同时满足你的两个需求:既可以检测长按满1秒的时刻,也能捕获所有用户松开屏幕的操作。

内容的提问来源于stack exchange,提问作者Ahmed Zaidan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 14:32:37