解决UIScrollView和滑动返回手势的冲突
解决UIScrollView和滑动返回手势的冲突
项目中浏览图片时,是以一个scrollview横向来展示多张图片,但是由于滑动返回手势和scrollview的滑动返回手势冲突了,导致在浏览图片时,页面不再能够滑动返回。所以想办法解决。
由于项目里的滑动返回,是UIPanGestureRecognizer,而且在项目中,只有滑动屏幕的左边100个像素,UIPanGestureRecognizer才会起作用。UIScrollView的滑动手势也是UIPanGestureRecognizer。那在侧边滑动时,让UIScrollView的不响应事件就OK了嘛,首先想到了继承UIScrollView 重写下面的方法,让滑动侧边时scrollView不响应事件,根据响应者链,事件最终会传递给下方的滑动手势。
- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event {
if (point.x < 100) {
return nil;
} else {
return [super hitTest:point withEvent:event];
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
OK,搞定测试一下,貌似没什么问题,滑动侧边可以返回,滑动非侧边绝对不会返回。问题这么容易就解决了?
由于项目中需求变化了,不仅需要浏览图片时可以滑动返回,在一个页面不同tab时,也需要滑动切换,滑动返回。那还不简单,只要滑动切换的scrollView的父类改为上面的类就好了。很快就修改完成了,滑动切换没问题,滑动返回没问题。但是页面最左边的按钮貌似点击不了了。。。终于发现问题,原来随意的一改,让在侧边操作时,scrollView不接受任何事件了,包括点击按钮也被忽略,看来这是个很严重,需要另外的解决办法。
由于scrollView的滑动手势拦截了事件,那我重写scrollView中panGestureRecognizer的代理方法,让它不拦截就好了嘛。于是继承UIScrollView,重写下面的方法。
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer {
if ([self panBack:gestureRecognizer]) {
return YES;
}
return NO;
}
- (BOOL)panBack:(UIGestureRecognizer *)gestureRecognizer {
if (gestureRecognizer == self.panGestureRecognizer) {
UIPanGestureRecognizer *pan = (UIPanGestureRecognizer *)gestureRecognizer;
CGPoint point = [pan translationInView:self];
UIGestureRecognizerState state = gestureRecognizer.state;
if (UIGestureRecognizerStateBegan == state || UIGestureRecognizerStatePossible == state) {
CGPoint location = [gestureRecognizer locationInView:self];
if (point.x > 0 && location.x < 90 && self.contentOffset.x <= 0) {
return YES;
}
}
}
return NO;
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
需要侧边滑动时 panBack 返回YES,这时候,我让scrollView的手势和页面的滑动返回手势共存,scrollView不拦截手势,那不就可以滑动返回了吗。好了,测试一下,可以滑动返回,但是滑动返回时,为什么scrollView也跟着在滑动呢,太影响美观了,看来还需要另外的办法,我又回到了第一种办法时的想法,让scrollView切换的时候相应panGesture,滑动返回的时候不响应,那重写scrollView中的另外一个panGestureRecognizer的代理方法。
- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer {
if ([self panBack:gestureRecognizer]) {
return NO;
}
return YES;
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
ok,测试一下,切换可以,滑动返回可以。看来在我的项目中,这么解决目前来说算是完美的方案。
推荐阅读
-
解决UIScrollView和滑动返回手势的冲突
-
iOS 侧滑返回手势与Scrollview冲突的解决办法
-
android中view手势滑动冲突的解决方法
-
android中view手势滑动冲突的解决方法
-
右滑返回手势和UIScrollView中手势冲突的解决方法
-
右滑返回手势和UIScrollView中手势冲突的解决方法
-
解决右滑返回手势和UIScrollView中的手势冲突
-
iOS UIScrollView和控制器返回手势冲突解决方法
-
解决Scrollview和ExpandableListView/ListView/Recyclerview 之间的滑动冲突
-
解决右滑返回手势和UIScrollView中的手势冲突