Swift中如何实现按钮点击与长按不同操作,且长按释放后跳转页面?
Swift按钮区分点击与长按(释放后执行长按操作)
直接用simultaneousGesture会出现冲突——点击手势会在长按还没完成时就触发,所以得通过手势状态跟踪来区分两种操作,确保长按只有释放后才执行,同时不干扰正常点击。
下面是完整的实现代码:
import SwiftUI struct GestureButtonView: View { // 跟踪是否处于长按状态 @GestureState private var isLongPressing = false var body: some View { Button(action: { // 只有当没有触发长按的时候,才执行点击操作 if !isLongPressing { print("执行点击操作") // 这里放你的点击逻辑,比如弹出提示、跳转页面等 } }) { Text("点击/长按我") .padding() .background(Color.blue) .foregroundColor(.white) .cornerRadius(8) } // 添加长按手势,同时关联GestureState .gesture( LongPressGesture(minimumDuration: 0.5) // 调整长按触发的最短时长 .updating($isLongPressing) { currentState, gestureState, transaction in gestureState = currentState } .onEnded { _ in print("长按释放,执行长按操作") // 这里放长按释放后的逻辑,比如打开新页面 } ) } } #Preview { GestureButtonView() }
关键逻辑说明:
@GestureState用来实时跟踪长按的状态:当用户开始长按,isLongPressing变为true;松手或取消长按后自动重置为false(GestureState的特性,无需手动重置)。- 按钮的默认
action只在isLongPressing为false时执行,避免长按过程中误触发点击。 - 长按的操作放在
onEnded回调里,确保只有用户释放长按后才执行。
另一种方案:用组合手势(如果需要更精细的控制)
如果不想依赖按钮的默认action,也可以用ExclusiveGesture让长按优先于点击,再结合状态判断:
struct GestureButtonView: View { @State private var didLongPress = false var body: some View { Text("点击/长按我") .padding() .background(Color.blue) .foregroundColor(.white) .cornerRadius(8) .gesture( // 长按手势:释放时标记状态 LongPressGesture(minimumDuration: 0.5) .onEnded { _ in didLongPress = true print("长按释放,执行操作") } // 组合手势:长按优先,否则触发点击 .exclusively(before: TapGesture() .onEnded { if !didLongPress { print("执行点击操作") } didLongPress = false // 重置状态 } ) ) } }
这两种方案都能解决你的问题,第一种更简洁,利用了SwiftUI的GestureState特性,推荐优先使用。
内容的提问来源于stack exchange,提问作者JJ Trejo
相关产品推荐
相关产品推荐

