我在我的
UIView
中添加了两个手势识别器:
func tap(sender: UITapGestureRecognizer){
if sender.state == .began {
print("snapping photo")
}
}
func longPress(sender: UILongPressGestureRecognizer) {
if sender.state == .began {
print("snapping video")
}
}
当两者均设置为
state == .began
时,仅 longPress
触发。当我将 Tap 设置为 .ended
时,两者都会触发。
为什么点击状态设置为
.began
时不起作用?
处理 UIKit 手势告诉我们:
手势识别器有两种类型:离散和连续。 离散手势识别器在识别手势后立即调用您的操作方法。满足初始识别标准后,连续手势识别器会多次调用您的操作方法,每当手势事件中的信息发生变化时通知您。
...
属性传达对象的当前识别状态。对于连续手势,手势识别器会将此属性的值从state
更新为.began
到.changed
,或.ended
。您的操作方法使用此属性来确定适当的操作过程。.cancelled
UITapGestureRecognizer
是一个离散手势,因此,当手势被识别时,您的事件处理程序将被调用一次。
实际上,这意味着您的点击手势识别器处理程序不会在 .began
状态下被调用。然而,它被称为 .ended
的状态。
(处理 UIKit 手势文档告诉我们,离散手势的处理程序将被“恰好一次”调用。这与我的经验一致。令人困惑的是,点击手势文档和处理点击手势参考建议应该测试
.ended
状态,尽管在实践中,这是唯一会调用轻击手势处理程序的状态。无论如何,虽然寻找 .ended
状态可能是谨慎的做法,但不要这样做永远不要期望在离散手势处理程序中看到 .began
状态。)
另一方面,UILongPressGestureRecognizer
是一个连续的手势,因此检查状态非常有用(确定手势何时
.began
、
.changed
、
.ended
等)。这就是为什么你看到它需要
state
的
.began
。