美文网首页iOS程序员iOS学习笔记
iOS 滑动返回手势与滚动视图手势冲突问题

iOS 滑动返回手势与滚动视图手势冲突问题

作者: Matt_Yuen | 来源:发表于2016-08-15 12:26 被阅读1553次

最近项目中有一个聊天的页面,不是本人做的,其中键盘视图有一个自己的表情视图,这个选择表情的视图是一个滚动视图,如果在向右滑动表情的滚动视图的时候,滑动的位置太靠右的话,就会触发UINavigationController的向右滑动返回,整个聊天页面就会pop掉了。为了避免这种冲突,我们需要对滚动视图的手势和边缘触发返回的手势进行处理。 首先,看API的话,会发现滚动视图的一个属性,也就是滚动视图滑动的手势;

@property(nonatomic, readonly) UIPanGestureRecognizer *panGestureRecognizer NS_AVAILABLE_IOS(5_0);

然后,手势的话,有一个可以解决这个问题的API方法,这个方法我在网上查,理解就是,如果otherGestureRecognizer这个手势没有执行成功的话,才会执行调用这个方法的手势。

- (void)requireGestureRecognizerToFail:(UIGestureRecognizer *)otherGestureRecognizer;

再然后,我们需要获取这两个本来会发生冲突的手势:

1.滚动视图的手势就不用多说了,用属性的getter取就好了:

self.scrollView.panGestureRecognizer;

2.边缘返回的手势,用一个方法就可以获取到:

- (UIScreenEdgePanGestureRecognizer *)screenEdgePanGestureRecognizer
{
    UIScreenEdgePanGestureRecognizer *screenEdgePanGestureRecognizer = nil;

    if (self.navigationController.view.gestureRecognizers.count > 0) {
        for (UIGestureRecognizer *recognizer in self.navigationController.view.gestureRecognizers){
            if ([recognizer isKindOfClass:[UIScreenEdgePanGestureRecognizer class]]) {
                screenEdgePanGestureRecognizer = (UIScreenEdgePanGestureRecognizer *)recognizer;
                break;
            }
        }
    }
    return screenEdgePanGestureRecognizer;
}

最后,我们用手势的requireGestureRecognizerToFail:这个方法来处理这两个手势就好了:

[[self screenEdgePanGestureRecognizer] requireGestureRecognizerToFail:self.scrollView.panGestureRecognizer];

也就是说,我们在操作滚动视图的时候的,只要滚动视图的手势能够触发,就不会执行滑动返回的那个手势,并且除了这个滚动视图外,在其他地方对滑动返回没有影响。


第一次写技术型的笔记,没有什么经验,所以大家多多提意见,如果内容写的不对的,误导性的,也请慷慨指出,肯定会虚心更正的。

相关文章

网友评论

  • wakakaJP:作者您好,我遇到了一个问题,就是我在push出来的控制器上放了一个屏幕等宽的、横向滑动colloectionView,我遇到的问题跟您相反,边缘滑动返回的手势操作失效了,参考您的做法,我将返回手势的优先级设置的更高,依然无法解决问题,求解答
    Matt_Yuen:能发我你遇到问题的Demo吗?能的话私信加个联系方式讨论解决一下。
  • 路过河边:不错 我也遇到这个问题 不过我取巧了 当滑动到最右边 contentoffset.x <=0就设置为1这样永远不会触发controller的返回动作
    MindTheGap:@路过河边 从屏幕最左端触发返回手势,scrollview根本就不会动的,好伐?😆
    Matt_Yuen:@路过河边 这样啊,同样是避免触发边缘的返回事件,新思路get,回头试试
  • 晨曦之光nl:self.scrollView.panGestureRecognizer; 这个是getter方法 :sob:
    Matt_Yuen:@晨曦之光nl 对对对,明明后面写的取,竟然写的setter,写写指出错误,我会改掉的

本文标题:iOS 滑动返回手势与滚动视图手势冲突问题

本文链接:https://www.haomeiwen.com/subject/psjusttx.html