UTapGestureRecognizer不适用于.began状态

我已经为我的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 ,只有state == .began会触发。 当我点击.ended ,两个都开火了。

当状态设置为.began时,为什么不点击工作?

UITapGestureRecognizer是一个离散手势,因此,只有在识别手势时才会调用您的事件处理程序。 您根本不必检查state (如果调用了手势识别器,则识别手势)。 当然,你不会收到.began state.began

UILongPressGestureRecognizer是一个连续的手势,因此检查状态非常有用(确定手势何时开始,更改,结束等)。 这就是为什么你看到它要求.beganstate

有关离散与连续手势识别器的更多信息,请参阅处理UIKit手势 ,其中说:

手势识别器有两种类型:离散和连续。 在识别手势后,离散手势识别器会精确调用您的操作方法一次。 在满足其初始识别标准后,连续手势识别器会多次调用您的操作方法,并在手势事件中的信息发生变化时通知您。 例如,每次触摸位置更改时, UIPanGestureRecognizer对象都会调用您的操作方法。

手势识别器的状态属性传达对象的当前识别状态。 对于连续手势,手势识别器将此属性的值从UIGestureRecognizer.State.began更新为UIGestureRecognizer.State.changedUIGestureRecognizer.State.ended ,或更新为UIGestureRecognizer.State.cancelled