zoukankan      html  css  js  c++  java
  • 解决右滑返回手势和UIScrollView中的手势冲突(转)

    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 ([self panBack:gestureRecognizer]) {
    
            return YES;
    
        }
    
        return NO;
    
        
    
    }
    
     
    
    //location_X可自己定义,其代表的是滑动返回距左边的有效长度
    
    - (BOOL)panBack:(UIGestureRecognizer *)gestureRecognizer {
    
        
    
        int location_X = 100;
    
        
    
        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 < 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;
    
        
    
    }

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

    另外要注意重写的自定义的UIScrollView要记得实现协议 UIGestureRecognizerDelegate

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

  • 相关阅读:
    SuSe Linux 10 企业服务器搭建双机集群配置实例
    升级你的Linux日志系统
    企业部署Linux应用将拥有更低的TCO
    用VXE保护Linux系统安全
    Leetcode-995 Minimum Number of K Consecutive Bit Flips(K 连续位的最小翻转次数)
    Leetcode-994 Rotting Oranges(腐烂的橘子)
    Leetcode-993 Cousins in Binary Tree(二叉树的堂兄弟节点)
    Leetcode-552 Student Attendance Record II(学生出勤记录 II)
    Leetcode-213 House Robber II(打家劫舍 II)
    Leetcode-312 Burst Balloons(戳气球)
  • 原文地址:https://www.cnblogs.com/funny11/p/6509694.html
Copyright © 2011-2022 走看看