系统返回手势与ScrollView的冲突

目录
  1. 1. 情景
  2. 2. 原因
  3. 3. 解决

情景

项目中遇到一个页面中是以一个scrollview横向Tab展示两个不同功能的显示,如图:

示例图
由于滑动返回手势和scrollview的滑动返回手势冲突了,导致页面不再能够滑动返回。类似的还有图片浏览功能也出现过。

原因

iOS系统中,滑动返回手势,其实是一个UIPanGestureRecognizer,系统默认的操作是只有滑动屏幕的左边的某个位置,UIPanGestureRecognizer才会起作用。UIScrollView的滑动手势也是UIPanGestureRecognizer。
由于scrollView的滑动手势拦截了事件,所以系统的滑动返回手势就不会再被触发。

解决

根据上面的原因,我们需要响应系统的手势,那么我们有两个思路,一个思路是中断ScrollView的其实是一个UIPanGestureRecognizer手势,以便响应系统的手势,另一个是让ScrollView不阻拦系统的手势。
第一个思路的实现:

1
2
3
4
5
6
7
- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event {
if (在ScrollViewd最左边,且当前是向右滑动) {//伪代码
return nil;
} else {
return [super hitTest:point withEvent:event];
}
}

第二种,通过代理,让两种手势共存

1
2
3
4
5
6
7
8
9
10
11
12
13
-(BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer
{
// 首先判断otherGestureRecognizer是不是系统pop手势
if ([otherGestureRecognizer.view isKindOfClass:NSClassFromString(@"UILayoutContainerView")]) {
// 再判断系统手势的state是began还是fail,同时判断scrollView的位置是不是正好在最左边
if (otherGestureRecognizer.state == UIGestureRecognizerStateBegan
&& self.contentOffset.x == 0) {
return YES;
}
}
return NO;
}

本作品采用 署名-非商业性使用-相同方式共享 2.5 中国大陆 (CC BY-NC-SA 2.5)协议 进行许可,欢迎转载,但转载请注明来自SarielTang,并保持转载后文章内容的完整。本人保留所有版权相关权利。

本文永久链接:http://sarieltang.github.io/2016/05/19/知识点小结/2016-05-19/index/