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

来源:互联网 时间:2017-01-22


最近项目中有一个聊天的页面,不是本人做的,其中键盘视图有一个自己的表情视图,这个选择表情的视图是一个滚动视图,如果在向右滑动表情的滚动视图的时候,滑动的位置太靠右的话,就会触发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];

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


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




相关阅读:
Top