UIPanGestureRecognizer有时不适用于iOS 7

我收到iOS 7用户的间歇性报告,说UIPanGestureRecognizerUIPanGestureRecognizer停止在某些视图上工作。 他们应该能够将视图向左/向右滑动,但是只是因为某些未知的原因而中断并且不起作用。 强制退出应用程序并重新启动它可以解决问题。

这个问题在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 )有什么改变,可能会导致这个问题?

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

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

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

有关更多信息,请参阅https://stackoverflow.com/a/19892166/1593765

为什么你只会在gestureRecognizerShouldBegin中返回NO,手势识别器只有垂直移动? 由于手指是由用户用手指(而不是由机器制造的)做出的手势,所以由于移动手指的不准确性,其总是会有一定的随机性。 gestureRecognizerShouldBegin:将在用户触摸屏幕后被调用,并且您得到的翻译可能只是几个像素。 你的识别器会失败,如果用户,即当他把手指放在屏幕上移动2个像素,即使他然后移动它200像素的权利。 这不应该导致手势识别器被永久禁用,但是您也应该仔细研究,因为当手势没有被识别时,它可能会使用户感到困惑。