我已经为我的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
开火。当我点击.ended
时,两个都开火了。
当状态设置为.began
时,为什么不点击工作?
UITapGestureRecognizer
是一个离散的手势,因此,当识别手势时,只调用一次事件处理程序。你根本不必检查state
(如果你的手势识别器被调用,手势被识别)。当然,你不会接到state
的.began
的电话。
UILongPressGestureRecognizer
是一个连续的手势,因此检查状态非常有用(确定手势何时开始,更改,结束等)。这就是为什么你看到它需要state
的.began
。
有关离散与连续手势识别器的更多信息,请参阅Handling UIKit Gestures,其中说:
手势识别器有两种类型:离散和连续。在识别手势后,离散手势识别器会准确调用您的操作方法一次。在满足其初始识别标准后,连续手势识别器会多次调用您的操作方法,并在手势事件中的信息发生变化时通知您。例如,每次触摸位置更改时,
UIPanGestureRecognizer
对象都会调用您的操作方法。
和
手势识别器的状态属性传达对象的当前识别状态。对于连续手势,手势识别器将此属性的值从
UIGestureRecognizer.State.began
更新为UIGestureRecognizer.State.changed
到UIGestureRecognizer.State.ended
或UIGestureRecognizer.State.cancelled
。