UITapGestureRecognizer 不适用于 .began 状态

问题描述 投票:0回答: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
触发。当我将 Tap 设置为
.ended
时,两者都会触发。

为什么点击状态设置为

.began
时不起作用?

ios swift uigesturerecognizer
1个回答
20
投票

处理 UIKit 手势告诉我们:

手势识别器有两种类型:离散和连续。 离散手势识别器在识别手势后立即调用您的操作方法。满足初始识别标准后,连续手势识别器会多次调用您的操作方法,每当手势事件中的信息发生变化时通知您。

...

手势识别器的

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

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

处理 UIKit 手势文档告诉我们,离散手势的处理程序将被“恰好一次”调用。这与我的经验一致。令人困惑的是,点击手势文档处理点击手势参考建议应该测试

.ended
状态,尽管在实践中,这是唯一会调用轻击手势处理程序的状态。无论如何,虽然寻找
.ended
状态可能是谨慎的做法,但不要这样做永远不要期望在离散手势处理程序中看到
.began
状态。)

另一方面,

UILongPressGestureRecognizer

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

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