SwiftUI - 如何检测按钮上的长按?

Posted

技术标签:

【中文标题】SwiftUI - 如何检测按钮上的长按?【英文标题】:SwiftUI - how to detect long press on Button? 【发布时间】:2020-02-29 11:01:47 【问题描述】:

我有一个按钮,当它被按下时,它会执行一些操作。但我想修改同一个 Button 以检测更长的按下,并执行一组不同的过程。如何修改此代码以检测长按?

Button(action: 
              // some processes

            ) 
              Image(systemName: "circle")
                .font(.headline)
                .opacity(0.4)

            

【问题讨论】:

【参考方案1】:

这是可能的变体(使用 Xcode 11.2 / iSO 13.2 测试)。

Button("Demo") 
    print("> tap")

.simultaneousGesture(LongPressGesture().onEnded  _ in
    print(">> long press")
)

【讨论】:

这是我见过的最好的解决方案。但是,请注意,按钮按下操作仍会在释放按钮时触发。在我的用例中,这无关紧要。 我喜欢这个解决方案,但是它仍然会触发按钮点击。有没有办法专门检测按钮的点击或长按?在这种情况下,它应该能够识别点击前的长按。【参考方案2】:

丹尼尔伍德的评论在这两个陈述中都是正确的。首先,它是最干净的解决方案。对于第二个,有一个简单的解决方法。

struct ContentView: View 
  @State private var didLongPress = false

  var body: some View 
    Button("Demo") 
      if self.didLongPress 
        self.didLongPress = false
          doLongPressThing()
       else 
          doTapThing()
      
    .simultaneousGesture(
      LongPressGesture().onEnded  _ in self.didLongPress = true 
    )
  

【讨论】:

以上是关于SwiftUI - 如何检测按钮上的长按?的主要内容,如果未能解决你的问题,请参考以下文章

检测音量按钮的长按和短按 - iOS

SwiftUI手势(Gesture)进阶 : 实现任意视图的长按惯性加速行为

SwiftUI手势(Gesture)进阶 : 实现任意视图的长按惯性加速行为

SwiftUI手势(Gesture)进阶 : 实现任意视图的长按惯性加速行为

使用 ng-click 或 jquery 检测平板电脑上的长按

使用 touch.tapCount 确定按钮上的长按