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

Posted

技术标签:

【中文标题】在某些情况下不调用 UIGestureRecognizerState.Ended【英文标题】:UIGestureRecognizerState.Ended is not called in some cases 【发布时间】:2015-10-10 16:36:06 【问题描述】:

当我拖动视图并将其放到新位置时,每次都会调用 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")
    

【问题讨论】:

【参考方案1】:

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

【讨论】:

我遇到了类似的问题,调用 Changed,但未调用 Canceled 或 Ended 这里也一样。你找到解决办法了吗?\ 这里也一样,有人找到解决方案了吗? 同时使用平移手势和点击手势可能会导致问题。平移时,有时会在平移手势结束之前调用点击手势。根据您的代码,这可能会导致问题。为了防止在平移过程中调用点击手势,请使用tap.require(toFail: pan)使用您的识别器名称)。【参考方案2】:

在我的情况下,这仅在我使用键盘上的 option 键在模拟器中使用两指捏合或旋转手势时发生。

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

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

【讨论】:

【参考方案3】:

当我在 switch 语句中有 .recognized 的情况时发生这种情况(不要这样做)。

【讨论】:

以上是关于在某些情况下不调用 UIGestureRecognizerState.Ended的主要内容,如果未能解决你的问题,请参考以下文章

为啥回顾中的有限重复在某些情况下不起作用?

Redshift ROUND 函数在某些情况下不舍入?

前缀计算器——在某些情况下不起作用——C++

多个 OpenGL 纹理在某些情况下不起作用?

为啥 MISRA-C 在某些情况下不允许隐式扩展类型?

为啥 AppDomain.CurrentDomain.GetAssemblies() 在某些情况下不返回 Global.asax 中的依赖程序集?