SwiftUI中具有双动作(轻点和长按)的按钮

4
在SwiftUI中,是否可以设置一个按钮,在点击时执行一个操作,在长按时执行另一个操作?
我尝试过以下代码:
Button(action: {
    self.handleButtonTap()
})
{
    Text("My nice button")
        .foregroundColor(.primary)
}
.onLongPressGesture {
    print("Long pressed!")
}

或者使用以下方法替代:

.onLongPressGesture {
    print("Long pressed!")
}

使用以下方法:

.gesture(longPress)

长按是指:

var longPress: some Gesture {
  ....
}

但是似乎什么都不起作用。 我最多能做的就是将长按手势附加到按钮的文本上,但即使在这种情况下,普通的轻触也无法使用。

如有好的建议,将不胜感激。

2个回答

8
这里有另一种解决方案,它在每次长按之后不会触发常规的点击操作。
Button("Button") {
    // No tap action here
}
.simultaneousGesture(LongPressGesture().onEnded { _ in
    print("Long-pressed")
})
.simultaneousGesture(TapGesture().onEnded {
    print("Tapped")
})

我在这篇博客文章中了解到这个内容:在SwiftUI中支持按钮的点击和长按 注意: 这可能无法在Catalyst中按预期工作,您可以在上述博客文章中了解更多信息。

@Michel 如果你在使用布尔变量解决问题时遇到了困难,这可能是一个更好的解决方案。 - Alexander Sandberg
在我看来,这是一个很棒的解决方案。 - Frank
来自链接博客文章的示例代码为我解答了这个问题。谢谢! - Trent M.

2

请确认此方法适用于您:

Button("Button") {
    print("tapped")
}
.simultaneousGesture(LongPressGesture().onEnded { _ in
    print("long pressed")
})


请注意,在上述代码中,每次长按后都会执行tap操作。您可以通过一个简单的布尔值来处理这个问题。

是的,它有效。正如您所提到的,它可以用布尔值来处理。 - Michel
还有一个细节,在某些情况下,布尔值的解决方法是不必要的,因为主要操作根本没有被调用。比如在长按操作中打开另一个视图。 - Michel
这是一种更紧凑的解决方案,但如果您想避免按钮长按调用tap和long press,则@Alexander-Sandberg的解决方案更好。 - Matt Long

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