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

 更新时间:2017年02月25日 08:54:40   作者:jgCho  
这篇文章主要为大家详细介绍了右滑返回手势和UIScrollView中手势冲突的解决方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

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

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

- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event   {
   if (point.x < location.x) { // location.x为系统的某个点的x
     return nil;
   } else {
     return [super hitTest:point withEvent:event];
   }
}

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

由于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 < “这个自己设定" && self.contentOffset.x <= 0) {
          return YES;
       }
     }
   }
   return NO;

}

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

- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer {

  if ([self panBack:gestureRecognizer]) {
    return NO;
  }
  return YES;

}

第二种方法:

 -(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; 
}

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

原理:
scrollView的pan手势会让系统的pan手势失效,所以我们只需要在系统手势失效且scrollView的位置在初始位置的时候让两个手势同时启用就可以了。

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

相关文章

  • iOS应用内实现跳转到手机淘宝天猫的方法

    iOS应用内实现跳转到手机淘宝天猫的方法

    这篇文章主要给大家介绍了关于iOS应用内如何实现跳转到手机淘宝天猫的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧。
    2017-12-12
  • IOS  多线程GCD详解

    IOS 多线程GCD详解

    这篇文章主要介绍了IOS 多线程GCD详解的相关资料,需要的朋友可以参考下
    2016-09-09
  • iOS 定制多样式二维码

    iOS 定制多样式二维码

    最常见的二维码功能包括信息获取、网站跳转、电商交易、手机支付等等,其拥有密度小、信息容量大、容错能力强、成本低、制作难度低等优点。在移动开发中,二维码的地位也越来越重要,掌握二维码的基本操作是重要的本领之一。本文将讲解iOS定制二维码的步骤与方法。
    2017-03-03
  • ios 11和iphone x的相关适配问题及解决方法

    ios 11和iphone x的相关适配问题及解决方法

    这篇文章主要介绍了ios 11和iphone x的相关适配,文中给大家提到了在ios 11中,tableView会莫名偏移问题的解决方法,非常不错,具有参考借鉴价值,需要的朋友可以参考下
    2017-11-11
  • HTTP/2 协议用于 iOS 推送提醒服务 (APNS)

    HTTP/2 协议用于 iOS 推送提醒服务 (APNS)

    基于JSON的请求和响应对于每个通知,如果成功响应,将会返回200标识 - 不用再去猜测通知是否被接收到响应错误将会以JSON字符消息的长度从2048个字节增加到4096个字节连接状态可以通过HTTP/2的ping框架来进行检查.
    2016-04-04
  • iOS常用算法之两个有序数组合并(要求时间复杂度为0(n))

    iOS常用算法之两个有序数组合并(要求时间复杂度为0(n))

    这篇文章主要介绍了iOS常用算法之两个有序数组合并(要求时间复杂度为0(n)),实现思路是先将一个数组作为合并后的数组, 然后遍历第二个数组的每项元素,需要的朋友可以参考下
    2019-07-07
  • iOS App中UITableView左滑出现删除按钮及其cell的重用

    iOS App中UITableView左滑出现删除按钮及其cell的重用

    这篇文章主要介绍了iOS App中UITableView左滑出现删除按钮及其cell的重用的方法,实例代码为传统的Objective-C语言,需要的朋友可以参考下
    2016-03-03
  • iOS中关于Cookie验证登录状态

    iOS中关于Cookie验证登录状态

    这篇文章主要介绍了iOS中关于Cookie验证登录状态的相关资料,需要的朋友可以参考下
    2017-05-05
  • 浅析iOS中的浅拷贝和深拷贝(copy和mutableCopy)

    浅析iOS中的浅拷贝和深拷贝(copy和mutableCopy)

    ios提供了copy和mutablecopy方法,顾名思义,copy就是复制了一个imutable的对象,而mutablecopy就是复制了一个mutable的对象。本文给大家介绍iOS中的浅拷贝和深拷贝(copy和mutableCopy) ,感兴趣的朋友一起看看吧
    2016-04-04
  • iOS按比例实现方块图

    iOS按比例实现方块图

    这篇文章主要为大家详细介绍了iOS按比例实现方块图,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-06-06

最新评论