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
相关产品推荐
相关产品推荐

