防止superview识别平移手势(在iOS 7中)

时间:2014-05-13 05:07:08

标签: ios iphone objective-c touch gesture

我实施了一个侧栏NavigationController,它由前后ViewController组成。此侧栏NavigationController确实使用平移和滑动gesture recognizers让用户在前视图和后视图之间切换。它工作正常。但是在前面TableView使用ViewController会导致恼人的行为。每当我在表格视图中滚动时,我的侧栏NavigationControllers的平移手势识别器会识别我手指的水平移动并相应地移动前视图控制器。

现在,我的问题是:当我在表格视图中滚动时,是否可以阻止超级视图(侧栏NavigationController's视图)识别平移手势?它以某种方式与导航控制器的后滑动手势一起工作,因为当向后滑动(从左到右)时,我的侧栏NavigationController无法识别平移手势。它也可以与前视图中的UISlider完美配合。因此,我可以将滑块的拇指从左向右移动,我的侧栏NavigationController根本不会重新显示平移手势。因此,滑块会以某种方式阻止将触摸事件转发到其超级视图。如何在表格视图中实现相同的目标?

3 个答案:

答案 0 :(得分:1)

尝试以下方法之一:

  • 设置手势委托并防止同时识别2个手势
  • 实施UIScreenEdgePanGestureRecognizer
  • 在状态为UIGestureRecognizerStateBegan时,在手势委托中检查手势的位置,并在位于表格视图中的情况下同时调用gesture.enabled = NO; gesture.enabled = YES;以断开手势识别。

不幸的是,每种方法都可能产生副作用。

答案 1 :(得分:1)

我之前的一个项目遇到了同样的问题。

我最终在视图控制器(UIGestureRecognizerDelegate函数)中覆盖了 shouldBeRequiredToFailByGestureRecognizer ,以防止其他视图窃取我的手势

//Prevents the map from stealing gestures from headerview
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldBeRequiredToFailByGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer {

    if(gestureRecognizer is your gesture)
        return YES;

    return NO;
}

请记住设置手势识别器的代理!

答案 2 :(得分:0)

我修改了在SideBarNavigationController中实现的手势识别,现在我能够实现所需的行为。

所以,我只需要改变delagate方法gestureRecognizer的实现:shouldRecognizeSimultaneouslyWithGestureRecognizer:。之前,它只返回YES,以便SideBarNavigationController可以同时检测滑动和平移手势。现在实现更改为以下内容:

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer
{
    BOOL shouldRecognize = NO;

    if (  (  (gestureRecognizer == _rightSwipeGestureRecognizer)
           ||(gestureRecognizer == _leftSwipeGestureRecognizer)
           ||(gestureRecognizer == _panGestureRecognizer))
        &&(  (otherGestureRecognizer == _rightSwipeGestureRecognizer)
           ||(otherGestureRecognizer == _leftSwipeGestureRecognizer)
           ||(otherGestureRecognizer == _panGestureRecognizer)))
    {
        shouldRecognize = YES;
    }

    return shouldRecognize;
}

该方法现在检查两个给定的手势识别器是否与我在SideBarNavigationController中创建的手势识别器相同。如果是,则该方法返回YES。否则,如果其中一个手势识别器来自另一个视图,如表视图,则methoed返回NO,以便SideBarNavigationController停止检测滑动和平移手势。

相关问题