UIPanGestureRecognizer 有时无法在 iOS 7 上运行

Posted

技术标签:

【中文标题】UIPanGestureRecognizer 有时无法在 iOS 7 上运行【英文标题】:UIPanGestureRecognizer sometimes not working on iOS 7 【发布时间】:2013-10-13 15:16:44 【问题描述】:

我收到来自 ios 7 用户的间歇性报告,称 UIPanGestureRecognizer 每隔一段时间就会停止处理某些视图。他们应该能够向右/向左滑动视图,但它只是中断并且由于某些未知原因而不起作用。强制退出应用程序并重新启动它可以解决问题。

这个问题在 iOS 6 上从未发生过。除了强制手势仅识别水平平移的 gestureRecognizerShouldBegin 委托之外,我没有任何代码可以随时禁用手势识别器:

- (BOOL)gestureRecognizerShouldBegin:(UIPanGestureRecognizer *)gestureRecognizer 

    if ([gestureRecognizer isMemberOfClass:[UIPanGestureRecognizer class]])  

        CGPoint translation = [gestureRecognizer translationInView:[self superview]];

        if (fabsf(translation.x) > fabsf(translation.y)) 

            if (translation.x > 0)
                return YES;
        
    
    return NO;

UIPanGestureRecognizer(或只是简单的UIGestureRecognizer)中是否有任何可能导致此问题的变化?

【问题讨论】:

您是否验证了x > y 检查不会在手势识别器似乎无法正常工作时导致提前退出? 不幸的是,我什至无法在我的任何设备上重现该错误,但我收到了来自用户的足够多的报告,我知道不仅仅是一个用户不知道他们是什么做。 我已经做了几次了。 gestureRecognizerShouldBegin 被调用并正确返回YES,但我分配给UIPanGestureRecognizer 的方法没有被调用。所以它识别手势但不调用方法... @bmueller 你找到解决方案了吗?我们也见过很多次(使用 UITapGestureRecognizers),但没有可靠的方法来重现它。它每次都会出现在不同的地方。 还没有,很遗憾:\ 【参考方案1】:

我想我终于解决了这个问题。显然,iOS 7 在子视图中处理手势的方式与在 iOS 6 及更早版本中不同。为了解决这个问题,Apple 实现了一个新的委托:

(BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldBeRequiredToFailByGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer

如果您返回 YES,那应该可以让您的手势识别器工作。我已经实现了它,到目前为止还没有遇到任何问题(尽管我承认这是一个罕见的错误,我永远无法可靠地重现,所以它可能还没有再次出现)。

有关详细信息,请参阅 https://***.com/a/19892166/1593765.

【讨论】:

惊人的收获!谢谢! :-) 我的 UIPanGestureRecognizer 也有这个错误,方向在左/右委托中不起作用返回总是 NO,在某种图像中,我找不到解释(但是当我在这个答案上更改委托方法时工作。谢谢你! 很棒的提示!花几个小时在这个上!【参考方案2】:

为什么仅仅因为在gestureRecognizerShouldBegin:运动是垂直的,就在手势识别器中返回NO? 由于是用户用手指做出的手势(而不是机器做出的),由于手指移动的不准确性,它的运动总会有一些随机性。 gestureRecognizerShouldBegin: 将在用户触摸屏幕后立即调用,您获得的翻译可能只是几个像素。如果用户将手指放在屏幕上时将其向上移动 2 个像素,即使他随后将其向右移动 200 个像素,您的识别器也会失败。 这不应该导致手势识别器被永久禁用,但您也应该调查一下,因为当他们的手势似乎无缘无故无法识别时,它可能会使用户感到困惑。

【讨论】:

以上是关于UIPanGestureRecognizer 有时无法在 iOS 7 上运行的主要内容,如果未能解决你的问题,请参考以下文章

UISegmentedControl 和 UIPanGestureRecognizer?

UIPanGestureRecognizer中的Velocity和translation开始状态

在 UIButtons 上禁用 UIPanGestureRecognizer

UIPanGestureRecognizer 碰撞

如何在父视图中限制 UIPanGestureRecognizer

UIPanGestureRecognizer 干扰滚动