UTapGestureRecognizer不适用于.began状态

问题描述 投票:3回答:1

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

ios swift uigesturerecognizer
1个回答
6
投票

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

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

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.