最近项目中有一个聊天的页面,不是本人做的,其中键盘视图有一个自己的表情视图,这个选择表情的视图是一个滚动视图,如果在向右滑动表情的滚动视图的时候,滑动的位置太靠右的话,就会触发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];
也就是说,我们在操作滚动视图的时候的,只要滚动视图的手势能够触发,就不会执行滑动返回的那个手势,并且除了这个滚动视图外,在其他地方对滑动返回没有影响。
第一次写技术型的笔记,没有什么经验,所以大家多多提意见,如果内容写的不对的,误导性的,也请慷慨指出,肯定会虚心更正的。
网友评论