阻止UIScrollView的UIPanGestureRecognizer阻止UIScreenEdgePanGestureRecognizer

时间:2014-02-15 07:37:17

标签: ios iphone uiscrollview uigesturerecognizer uipangesturerecognizer

我有一个UIScrollView填充我应用的一个页面上的屏幕,但是我希望允许用户从屏幕边缘平移以显示其背后的视图。问题是UIScrollView窃取了屏幕边缘UIScreenEdgePanGestureRecognizer的触摸。不幸的是,我无法从具有UIScreenEdgePanGestureRecognizer的视图控制器访问UIScrollView(反之亦然),因此我无法使用requireGestureRecognizerToFail:方法,因为我无法使用指定应该允许哪个手势识别器失败。具有滚动视图的视图控制器是容器视图控制器的子视图控制器,其具有连接到容器视图控制器的一个视图的屏幕边缘平移手势识别器。

我也无法使用委托方法

-(BOOL)gestureRecognizer:shouldRequireFailureOfGestureRecognizer:

因为UIScrollView不允许我将视图控制器设置为滚动视图UIPanGestureRecognizer的委托。

如何防止滚动视图从我自己的手势识别器中窃取边缘触控?

2 个答案:

答案 0 :(得分:24)

不幸的是,创建此行为可能是真正的P *** i * t ** A **。

幸运的是,即使您无法直接访问一个GestureRecognizer,也可以使用UIGestureRecognizer委托创建此行为。

-(BOOL)gestureRecognizer:shouldRequireFailureOfGestureRecognizer:
-(BOOL)gestureRecognizer:shouldRecognizeSimultaneouslyWithGestureRecognizer:
-(BOOL)gestureRecognizer:shouldBeRequiredToFailByGestureRecognizer: 

当你的gestureRecognizer与scrollView的'碰撞'时,委托方法中传递的第二个参数('otherGestureRecognizer')会保存UIScrollView的PanGestureRecognizer(或私有的Apple - 子类)。

只需设置UIScreenEdgePanGestureRecognizer的委托即可回复委托方法。

这两种方法的命名非常不理想,说实话,我真的不知道你的案例的正确回报值是什么。

我昨天刚遇到这个问题,我通过残酷的试验解决了这个问题。错误。

我是我的情况,从ShouldRequireToFail和shouldBeRequiredToFail方法返回NO,同时方法中的YES解决了我的问题。

Note: Returning NO from both methods changed the behavior compared to not 
even implementing the methods at all. Even though the documentation says 
the default return value is NO.

但是,使用委托方法可以实现任何GestureRecognizer行为。但正如我上面所说,这些方法的命名非常混乱。 +这些方法没有任何有用的文档。

答案 1 :(得分:12)

这可以在不必将屏幕平移手势的委托设置到视图控制器的情况下完成。

[scrollView.panGestureRecognizer requireGestureRecognizerToFail:screenPanGesture];