我在我的应用程序中添加了两个手势识别器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
, only longPress
火灾。当我将点击设置为.ended
,均着火。
为什么当其状态设置为 时,tap 不起作用.began
?
The 处理 UIKit 手势 https://developer.apple.com/documentation/uikit/touches_presses_and_gestures/handling_uikit_gestures告诉我们:
手势识别器有两种类型:离散和连续。 A离散手势识别器在识别手势后立即调用您的操作方法。在满足其初始认可标准后,连续手势识别器Performs 多次调用您的操作方法,每当手势事件中的信息发生变化时通知您。
...
The state https://developer.apple.com/documentation/uikit/uigesturerecognizer/1619998-state手势识别器的属性传达了对象当前的识别状态。对于连续手势,手势识别器会更新此属性的值.began
to .changed
to .ended
, or to .cancelled
。您的操作方法使用此属性来确定适当的操作过程。
The UITapGestureRecognizer
是一个离散手势,因此,当手势被识别时,您的事件处理程序将被调用一次。
实际上,这意味着您的点击手势识别器处理程序不会在以下状态下被调用:.began
。然而,人们呼吁建立一种状态.ended
.
(The 处理 UIKit 手势 https://developer.apple.com/documentation/uikit/touches_presses_and_gestures/handling_uikit_gestures文档告诉我们,离散手势的处理程序将被称为“恰好一次”。这与我的经验是一致的。令人困惑的是,点击手势文档 https://developer.apple.com/documentation/uikit/uitapgesturerecognizer和处理点击手势 https://developer.apple.com/documentation/uikit/touches_presses_and_gestures/handling_uikit_gestures/handling_tap_gestures参考文献建议人们应该测试一种状态.ended
尽管在实践中,这是唯一会调用点击手势处理程序的状态。无论如何,虽然寻找一种状态可能是谨慎的.ended
,永远不要期望看到这样的状态.began
在你的离散手势处理程序中。)
The UILongPressGestureRecognizer
另一方面,是一个连续的手势,因此检查状态非常有用(确定手势何时.began
, .changed
, .ended
, ETC。)。这就是为什么你看到它要求state
of .began
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)