右滑返回手势和UIScrollView中手势冲突的解决方法

  

项目中遇到一个页面中是以一个滚动视图横向标签展示两个不同功能的显示,譬如消息和公告功能,但是由于滑动返回手势和滚动视图的滑动返回手势冲突了,导致页面不再能够滑动返回。类似的还有图片浏览功能也出现过。

  

iOS系统中,滑动返回手势,其实是一个UIPanGestureRecognizer,系统默认的操作是只有滑动屏幕的左边的某个位置,UIPanGestureRecognizer才会起作用.UIScrollView的滑动手势也是UIPanGestureRecognizer。那在侧边滑动时,让UIScrollView的不响应事件就好了嘛,首先想到了继承UIScrollView重写下面的方法,让滑动侧边时滚动视图不响应事件,根据响应者链,事件最终会传递给下方的滑动手势。

        ——(UIView *) hitTest: (CGPoint)点withEvent: (UIEvent *)事件{   如果(点。x & lt;location.x) {//location.x为系统的某个点的x   返回nil;   其他}{   返回(超级hitTest:一点withEvent:事件);   }   }   之前      

但是,这样有个问题,就是在一个页面不同选项卡时,也需要滑动切换,滑动返回。

  

由于滚动视图的滑动手势拦截了事件,那我重写滚动视图中panGestureRecognizer的代理方法,让它不拦截就好了嘛。于是继承UIScrollView,重写下面的方法。

        UIGestureRecognizer (BOOL)手势识别器:(*)手势识别器shouldRecognizeSimultaneouslyWithGestureRecognizer: UIGestureRecognizer (*) otherGestureRecognizer {      如果([自我panBack:手势识别器]){   返回YES;   }   返回NO;      }         UIGestureRecognizer (BOOL) panBack:(*)手势识别器{      如果(手势识别器==self.panGestureRecognizer) {   UIPanGestureRecognizer *潘=(UIPanGestureRecognizer *)手势识别器;   CGPoint点=(锅translationInView:自我);=gestureRecognizer.state UIGestureRecognizerState状态;   如果(UIGestureRecognizerStateBegan==| | UIGestureRecognizerStatePossible==状态){   CGPoint位置=(手势识别器locationInView:自我);   如果(点。x比;0,,的位置。x & lt;“这个自己设定”,,self.contentOffset。x & lt;=0) {   返回YES;   }   }   }   返回NO;      }      之前      

需要侧边滑动时panBack返回是的,这时候,我让滚动视图的手势和页面的滑动返回手势共存,滚动视图不拦截手势,那不就可以滑动返回了吗。好了,测试一下,可以滑动返回,但是滑动返回时,为什么滚动视图也跟着在滑动呢,太影响美观了,看来还需要另外的办法,我又回到了第一种办法时的想法,让scrollView切换的时候相应panGesture,滑动返回的时候不响应,那重写滚动视图中的另外一个panGestureRecognizer的代理方法。

        UIGestureRecognizer (BOOL) gestureRecognizerShouldBegin:(*)手势识别器{      如果([自我panBack:手势识别器]){   返回NO;   }   返回YES;      }      之前      

<强>第二种方法:

        UIGestureRecognizer (BOOL)手势识别器:(*)手势识别器shouldRecognizeSimultaneouslyWithGestureRecognizer: otherGestureRecognizer UIGestureRecognizer (*)   {//首先判断otherGestureRecognizer是不是系统流行手势   如果([otherGestureRecognizer。观点:isKindOfClass NSClassFromString (@ UILayoutContainerView)]) {//再判断系统手势的状态是还开始是失败,同时判断滚动视图的位置是不是正好在最左边   如果(otherGestureRecognizer。状态==UIGestureRecognizerStateBegan,,self.contentOffset。x==0) {   返回YES;   }   }      返回NO;   }      之前      

以上的代码都是在一个自定义的UIScrollView上的,重写上面的方法即可。然后让横向滚动的scrollView继承这个自定义UIScrollView就OK了。

  

<强>原理:
  强滚动视图的锅手势会让系统的锅手势失效,所以我们只需要在系统手势失效且滚动视图的位置在初始位置的时候让两个手势同时启用就可以了。

  

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。

右滑返回手势和UIScrollView中手势冲突的解决方法