SwiftUI - 如何检测按钮的长按操作?

6

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

Button(action: {
              // some processes

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

            }
4个回答

14

这是一个可能的变体(经过Xcode 11.2 / iSO 13.2测试)。

Button("Demo") {
    print("> tap")
}
.simultaneousGesture(LongPressGesture().onEnded { _ in
    print(">> long press")
})

2
这是我见过的最好的解决方案。但是请注意,释放按钮时仍会触发按钮按下操作。在我的用例中,这并不重要。 - Daniel Wood
1
我喜欢这个解决方案,但它仍然会触发按钮的轻按,如前所述。有没有一种方法可以专门检测按钮的轻按或长按?在这种情况下,它应该在轻按之前识别长按。 - Legolas Wang
1
这是一个不错的解决方案,但它禁用了我的滚动视图中的滚动。 - KANAYO AUGUSTIN UG

9
丹尼尔·伍德的评论在两个声明中都是正确的。首先,它是最清晰的解决方案。对于第二个声明,有一个直接的解决方法。
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 }
    )
  }
}

嘿,安德鲁!感谢这个解决方法。我们在2022年还有其他的解决方案吗?谢谢。 - Alexander Khitev

2

这样你也可以识别按钮的长按,与普通的轻点手势区分开:

        Button(action: {}) {
            Text("Push")
        }
        .simultaneousGesture(TapGesture().onEnded { _ in
            print("simultaneousGesture TapGesture")
        })
        .simultaneousGesture(LongPressGesture().onEnded { _ in
            print("simultaneousGesture LongPressGesture")
        })

1

iOS 15起,应使用带有primaryAction的菜单


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接