swift apGestureRecognizer不适用于. begun状态

qnzebej0  于 5个月前  发布在  Swift
关注(0)|答案(1)|浏览(75)

我在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会被触发。当我将tap设置为.ended时,两者都会被触发。
当状态设置为.began时,为什么tap不工作?

v440hwme

v440hwme1#

Handling UIKit Gestures告诉我们:
手势识别器有两种类型:离散和连续。* 离散手势识别器 * 在识别手势后只调用您的操作方法一次。在满足其初始识别条件后,* 连续手势识别器 * 会多次调用您的操作方法,并在手势事件中的信息发生更改时通知您。
...
手势识别器的state属性传达对象的当前识别状态。对于连续手势,手势识别器将此属性的值从.began更新为.changed.ended.cancelled。您的操作方法使用此属性来确定适当的操作过程。
UITapGestureRecognizer是一个离散的手势,因此,当手势被识别时,您的事件处理程序会被调用一次。实际上,这意味着您的点击手势识别器处理程序不会在.began状态下被调用。但是,它会在.ended状态下被调用。
(The Handling UIKit Gestures文档告诉我们,离散手势的处理程序将被调用“恰好一次”。这与我的经验一致。令人困惑的是,tap gesture documentationHandling Tap Gestures参考建议应该测试.ended的状态,即使在实践中,这是您的点击手势处理程序将被调用的唯一状态。无论如何,虽然寻找.ended的状态可能是谨慎的,但不要期望在离散手势处理程序中看到.began的状态。
另一方面,UILongPressGestureRecognizer是一个连续的手势,因此检查状态非常有用(确定手势.began.changed.ended等)。这就是为什么你看到它被称为.beganstate

相关问题