UTapGestureRecognizer不适用于.began状态

Nic*_*arr 4 uigesturerecognizer ios swift

我已经为我添加了两个手势识别器UIView:

func tap(sender: UITapGestureRecognizer){
    if sender.state == .began {
        print("snapping photo")
    }

}
func longPress(sender: UILongPressGestureRecognizer) {
    if sender.state == .began {
        print("snapping video")
    }
}
Run Code Online (Sandbox Code Playgroud)

当两者都设置为时state == .began,仅longPress触发.当我点击时.ended,两个都开火了.

为什么在状态设置为时不点击工作.began

Rob*_*Rob 7

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

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

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

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

手势识别器的状态属性传达对象的当前识别状态.对于连续手势,手势识别器将此属性的值更新UIGestureRecognizer.State.beganUIGestureRecognizer.State.changedto UIGestureRecognizer.State.ended或to UIGestureRecognizer.State.cancelled.

  • 谢谢,我一直在阅读推荐的[UITapGestureRecognizer doc](https://developer.apple.com/library/ios/documentation/UIKit/Reference/UITapGestureRecognizer_Class/index.html#//apple_ref/occ/cl/UITapGestureRecognizer)你检查状态,但你的链接更清楚地列出了离散/连续的区别. (2认同)