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