我在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
时,为什么tap不工作?
1条答案
按热度按时间v440hwme1#
Handling UIKit Gestures告诉我们:
手势识别器有两种类型:离散和连续。* 离散手势识别器 * 在识别手势后只调用您的操作方法一次。在满足其初始识别条件后,* 连续手势识别器 * 会多次调用您的操作方法,并在手势事件中的信息发生更改时通知您。
...
手势识别器的
state
属性传达对象的当前识别状态。对于连续手势,手势识别器将此属性的值从.began
更新为.changed
、.ended
或.cancelled
。您的操作方法使用此属性来确定适当的操作过程。UITapGestureRecognizer
是一个离散的手势,因此,当手势被识别时,您的事件处理程序会被调用一次。实际上,这意味着您的点击手势识别器处理程序不会在.began
状态下被调用。但是,它会在.ended
状态下被调用。(The Handling UIKit Gestures文档告诉我们,离散手势的处理程序将被调用“恰好一次”。这与我的经验一致。令人困惑的是,tap gesture documentation和Handling Tap Gestures参考建议应该测试
.ended
的状态,即使在实践中,这是您的点击手势处理程序将被调用的唯一状态。无论如何,虽然寻找.ended
的状态可能是谨慎的,但不要期望在离散手势处理程序中看到.began
的状态。另一方面,
UILongPressGestureRecognizer
是一个连续的手势,因此检查状态非常有用(确定手势.began
,.changed
,.ended
等)。这就是为什么你看到它被称为.began
的state
。