UITapGestureRecognizer不适用于.Begin状态 [英] UITapGestureRecognizer doesn't work for .began state

查看:15
本文介绍了UITapGestureRecognizer不适用于.Begin状态的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我向我的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时,两个都着火了。

为什么Tap的状态设置为.began时不工作?

推荐答案

Handling UIKit Gestures告诉我们:

手势识别器分为两种类型:离散和连续。离散手势识别器在识别手势后只调用一次操作方法。满足初始识别条件后,连续手势识别器会多次调用您的操作方法,并在手势事件中的信息发生更改时通知您。

...

手势识别器的state属性传达对象的当前识别状态。对于连续的手势,手势识别器将此属性的值从.began更新为.changed.ended.cancelled。您的操作方法使用此属性来确定适当的操作过程。

UITapGestureRecognizer是一个离散的手势,因此,当该手势被识别时,您的事件处理程序被调用一次。 实际上,这意味着您的点击手势识别器处理程序将不会在.began的状态下被调用。然而,它被称为.ended状态。

(Handling UIKit Gestures文档告诉我们,离散手势的处理程序将被"恰好调用一次"。这与我的经验是一致的。令人困惑的是,tap gesture documentationHandling Tap Gestures引用建议您应该测试.ended的状态,尽管在实践中,这是您的点击手势处理程序将被调用的唯一状态。无论如何,尽管寻找.ended的状态可能是谨慎的,但永远不要期望在离散的手势处理程序中看到.began的状态。)

另一方面,UILongPressGestureRecognizer是一个连续的手势,因此检查状态非常有用(确定手势何时.began.changed.ended等)。这就是为什么您看到它调用了.beganstate

这篇关于UITapGestureRecognizer不适用于.Begin状态的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆