繁体   English   中英

防止超级视图识别平移手势(在iOS 7中)

[英]Prevent the superview recognizing the pan gesture (in iOS 7)

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

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

尝试以下方法:

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

不幸的是,每种方法都有副作用。

在我的早期项目之一中,我遇到了同样的问题。

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

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

    if(gestureRecognizer is your gesture)
        return YES;

    return NO;
}

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

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

因此,我只需要更改脱位方法gestureRecognizer:的实现,就应该同时使用GestureRecognizer:来识别。 以前,它只是返回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中创建的手势识别器。 如果是这样,则该方法返回“是”。 否则,如果一个手势识别器来自另一个视图(如表格视图),则方法将返回NO,以便SideBarNavigationController停止检测滑动手势和平移手势。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM