UIGestureRecognizerState.Ended 在某些情况下不会被调用

问题描述 投票:0回答:4

当我拖动视图并将其放到新位置时。每次都会调用 Ended。

当我拖动视图一段时间并将其放在开始的同一位置时,没有任何内容被调用,我期望 .Ended 或 default 被调用,但没有发生。

为什么会出现这种情况?我如何了解用户何时持续释放视图?

var gestureRecognizer = UIPanGestureRecognizer(target: self, action: Selector("dragged:"))
gestureRecognizer.delegate = self
view.addGestureRecognizer(gestureRecognizer)

func dragged(gesture: UIPanGestureRecognizer) {
    switch gesture.state {
    case UIGestureRecognizerState.Began:
        print("calls this everytime touch began")
    case UIGestureRecognizerState.Ended:
        print("doesn't call this everytime")
    default: 
        print("never calls this")
    }
}
ios swift uigesturerecognizer uipangesturerecognizer
4个回答
2
投票

您几乎应该始终使用 UIGestureRecognizerState.Ended || UIGestureRecognizerState.Cancelled 作为两者之一肯定会在手势结束时被调用。这样您还可以处理用户拖过屏幕的情况。


1
投票

当我的 switch 语句中有

.recognized
的情况时,这发生在我身上(不要这样做)。


0
投票

就我而言,仅当我使用键盘上的 option 键在模拟器中使用两指捏合或旋转手势时,才会发生这种情况。

通常在手势结束后再次按 option 键(不移动鼠标)似乎可以解决问题并达到

.ended
状态。

我在实际设备上没有遇到这个问题。


0
投票

当您在

.recognized
案例之前有
.ended
作为案例时,可能会发生这种情况。如果您让 Xcode 自动完成所有案例,您可能会将
.recognized
作为案例。

问题是

.recognized
不是枚举的情况,它是一个静态变量(这是 Apple 手势识别器实现中的行):

public static var recognized: UIGestureRecognizer.State { get }

如果我尝试打印手势识别器的

.state
.recognized
静态变量的原始值,我会得到这个。

@objc func handlePan(_ gestureRecognizer: UIPanGestureRecognizer) {
   print(gestureRecognizer.state.rawValue, UIPanGestureRecognizer.State.recognized.rawValue)
}

将打印此:

1 3
2 3
3 3

右侧的“3”是手势识别器上静态

.recognized
的值,它始终是
.ended
。左边的“3”是手势识别器上实际
.state
的rawValue。

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