解决右滑返回手势和UIScrollView中的手势冲突
2016-09-02 10:22
627 查看
iOS系统中,滑动返回手势,其实是一个UIPanGestureRecognizer,系统默认的操作是只有滑动屏幕的左边的某个位置,UIPanGestureRecognizer才会起作用。UIScrollView的滑动手势也是UIPanGestureRecognizer。UIGestureRecognizer和UIView是多对一的关系(具体点这里),UIGestureRecognizer一定要和view进行绑定才能发挥作用。因此不难想象,UIGestureRecognizer对于屏幕上的手势事件,其接收顺序和UIView的层次结构是一致的
UINavigationController.view —> UIViewController.view —> UIScrollView —> Screen and User's finger
即UIScrollView的panGestureRecognizer先接收到了手势事件,直接就地处理而没有往下传递。
实际上这就是两个panGestureRecognizer共存的问题。
由于scrollView的滑动手势拦截了事件,那我重写scrollView中panGestureRecognizer的代理方法,让它不拦截就好了嘛。于是继承UIScrollView,重写下面的方法。
//一句话总结就是此方法返回YES时,手势事件会一直往下传递,不论当前层次是否对该事件进行响应。
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer
*)otherGestureRecognizer {
if ([selfpanBack:gestureRecognizer]) {
returnYES;
}
returnNO;
}
//location_X可自己定义,其代表的是滑动返回距左边的有效长度
- (BOOL)panBack:(UIGestureRecognizer *)gestureRecognizer {
int location_X =40;
if (gestureRecognizer ==self.panGestureRecognizer) {
UIPanGestureRecognizer *pan = (UIPanGestureRecognizer *)gestureRecognizer;
CGPoint point = [pantranslationInView:self];
UIGestureRecognizerState state = gestureRecognizer.state;
if (UIGestureRecognizerStateBegan == state ||UIGestureRecognizerStatePossible
== state) {
CGPoint location = [gestureRecognizerlocationInView:self];
if (point.x >0 && location.x
< location_X &&self.contentOffset.x <=0)
{
returnYES;
}
}
}
returnNO;
}
需要侧边滑动时 panBack 返回YES,这时候,我让scrollView的手势和页面的滑动返回手势共存,scrollView不拦截手势,那不就可以滑动返回了吗。好了,测试一下,可以滑动返回,但是滑动返回时,scrollView也跟着在滑动呢,我们应该让scrollView切换的时候相应panGesture,滑动返回的时候不响应,那重写scrollView中的另外一个panGestureRecognizer的代理方法。
- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer { if ([self panBack:gestureRecognizer]) { return NO; } return YES; }
以上的代码都是在一个自定义的UIScrollView上的,重写上面的方法即可。然后让横向滚动的scrollView继承这个自定义UIScrollView就OK了。
另外要注意重写的自定义的UIScrollView要记得实现协议 UIGestureRecognizerDelegate
原理:
scrollView的pan手势会让系统的pan手势失效,所以我们只需要在系统手势失效且scrollView的位置在初始位置的时候让两个手势同时启用就可以了。
注意:看完本文请继续阅读该篇文章
UIScrollView+横置UICollectionView实现滑动返回(以及每页都可滑动返回)
UINavigationController.view —> UIViewController.view —> UIScrollView —> Screen and User's finger
即UIScrollView的panGestureRecognizer先接收到了手势事件,直接就地处理而没有往下传递。
实际上这就是两个panGestureRecognizer共存的问题。
由于scrollView的滑动手势拦截了事件,那我重写scrollView中panGestureRecognizer的代理方法,让它不拦截就好了嘛。于是继承UIScrollView,重写下面的方法。
//一句话总结就是此方法返回YES时,手势事件会一直往下传递,不论当前层次是否对该事件进行响应。
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer
*)otherGestureRecognizer {
if ([selfpanBack:gestureRecognizer]) {
returnYES;
}
returnNO;
}
//location_X可自己定义,其代表的是滑动返回距左边的有效长度
- (BOOL)panBack:(UIGestureRecognizer *)gestureRecognizer {
int location_X =40;
if (gestureRecognizer ==self.panGestureRecognizer) {
UIPanGestureRecognizer *pan = (UIPanGestureRecognizer *)gestureRecognizer;
CGPoint point = [pantranslationInView:self];
UIGestureRecognizerState state = gestureRecognizer.state;
if (UIGestureRecognizerStateBegan == state ||UIGestureRecognizerStatePossible
== state) {
CGPoint location = [gestureRecognizerlocationInView:self];
if (point.x >0 && location.x
< location_X &&self.contentOffset.x <=0)
{
returnYES;
}
}
}
returnNO;
}
需要侧边滑动时 panBack 返回YES,这时候,我让scrollView的手势和页面的滑动返回手势共存,scrollView不拦截手势,那不就可以滑动返回了吗。好了,测试一下,可以滑动返回,但是滑动返回时,scrollView也跟着在滑动呢,我们应该让scrollView切换的时候相应panGesture,滑动返回的时候不响应,那重写scrollView中的另外一个panGestureRecognizer的代理方法。
- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer { if ([self panBack:gestureRecognizer]) { return NO; } return YES; }
以上的代码都是在一个自定义的UIScrollView上的,重写上面的方法即可。然后让横向滚动的scrollView继承这个自定义UIScrollView就OK了。
另外要注意重写的自定义的UIScrollView要记得实现协议 UIGestureRecognizerDelegate
原理:
scrollView的pan手势会让系统的pan手势失效,所以我们只需要在系统手势失效且scrollView的位置在初始位置的时候让两个手势同时启用就可以了。
注意:看完本文请继续阅读该篇文章
UIScrollView+横置UICollectionView实现滑动返回(以及每页都可滑动返回)
相关文章推荐
- iOS UIScrollView左右滑动手势与返回手势冲突的解决办法
- 解决右滑返回手势和UIScrollView中的手势冲突
- 解决UIScrollView和滑动返回手势的冲突
- 右滑返回手势和UIScrollView中手势冲突的解决方法
- 解决UIScrollView和滑动返回手势的冲突
- 解决UIScrollView滚动和子视图手势冲突的方案
- 解决UITableViewCell 上放置 UIScrollView 两者手势冲突
- 手势冲突---UITableView删除, 自定义侧滑返回,UIScroll的手势冲突
- iOS UIScrollview 和侧滑手势冲突解决方法
- iOS UIScrollview 和侧滑手势冲突解决方法
- 侧滑手势与UIScrollView滚动手势冲突解决
- IOS UIScrollView 手势返回冲突处理
- 侧滑返回和TableView滑动删除手势冲突完美解决
- uiscrollview_和_滑动返回冲突解决
- UIScrollView 侧滑的手势冲突怎么解决?
- 关于使用ViewFlipper实现手势滑动切换及其与ScrollView冲突的解决办法
- 定时器和UIScrollView的拖动事件冲突解决 RunLoop
- ViewPager中嵌套ViewFlipper手势冲突的解决办法
- iOS横向滚动的scrollView和系统pop手势返回冲突的解决办法
- 如何解决UIScrollView中添加UITapGestureRecognizer跟UIButton点击事件冲突