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

SwiftUI中OnLongPressGesture释放触发动作的实现方法咨询

如何在SwiftUI长按手势中处理释放动作(长按录制、松开停止)

这个问题的核心是用好onLongPressGesture的pressing参数——它会在按压状态变化时触发(包括用户开始按压、长按达标、以及松开按钮的时刻),而perform参数只是在长按达到最小时长时执行一次。针对你需要的「长按0.5秒开始录制、松开按钮停止录制」场景,我给你写个完整的可运行示例:

struct VideoRecorderButton: View {
    // 跟踪当前是否正在录制
    @State private var isRecording = false
    // 标记是否已经触发了录制开始(避免重复执行开始逻辑)
    @State private var didStartRecording = false

    var body: some View {
        Button(action: {}) {
            // 用图标直观展示录制状态
            Image(systemName: isRecording ? "circle.fill" : "circle")
                .font(.system(size: 40))
                .foregroundColor(isRecording ? .red : .blue)
        }
        .onLongPressGesture(
            minimumDuration: 0.5,   // 长按0.5秒后触发录制
            maximumDistance: 100,   // 允许按压时移动100pt以内
            pressing: { isPressing in
                // 当用户松开按钮时,isPressing会变为false
                if !isPressing {
                    if isRecording {
                        stopRecording()
                    }
                    didStartRecording = false
                }
            },
            perform: {
                // 长按达标后,执行开始录制逻辑
                startRecording()
                didStartRecording = true
            }
        )
    }

    // 模拟开始录制的逻辑
    private func startRecording() {
        isRecording = true
        print("✅ 开始录制视频")
        // 这里替换成你实际的录制代码(比如调用AVFoundation的录制API)
    }

    // 模拟停止录制的逻辑
    private func stopRecording() {
        isRecording = false
        print("⏹️ 停止录制视频")
        // 这里替换成你实际的停止录制代码
    }
}

关键细节解释:

  • pressing闭包:这是处理释放动作的核心。当用户松开按钮时,isPressing参数会变为false,此时我们检查当前是否在录制,若是则执行停止逻辑。
  • perform闭包:仅在长按达到minimumDuration(0.5秒)时触发一次,这里专门用来启动录制,避免用户误触(比如轻轻碰一下按钮就开始录制)。
  • didStartRecording变量:用来标记是否已经触发过录制开始,防止在按压过程中重复执行开始逻辑。

如果你需要「按住立刻开始录制」的场景:

如果不需要等待0.5秒,而是按住按钮就启动录制,只需要把minimumDuration设为0,并调整逻辑到pressing闭包里:

.onLongPressGesture(
    minimumDuration: 0,
    maximumDistance: 100,
    pressing: { isPressing in
        if isPressing {
            if !isRecording {
                startRecording()
            }
        } else {
            if isRecording {
                stopRecording()
            }
        }
    },
    perform: {} // 这里留空即可
)

这样调整后,用户按住按钮的瞬间就会开始录制,松开立刻停止,适合需要快速启动的场景。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 16:52:45