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