UTapGestureRecognizer不适用于.began状态

时间:2014-11-05 18:02:08

标签: ios swift uigesturerecognizer

我已经为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时,为什么不点击工作?

1 个答案:

答案 0 :(得分:6)

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

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

有关离散与连续手势识别器的详细信息,请参阅Handling UIKit Gestures,其中说明:

  

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

  

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