iOS中分页视图滚动和全屏返回手势冲突的问题

遇到这样的场景

1 我们这个页面是一个左右分页的容器页面,
可以左右滚动分页,然后app整体之前是支持右滑返回的,
这样就遇到一个问题,就是我们在分页的最左边的时候,滑动的时候
,因为分页的scrollView的滑动手势是在最上层的左右滑动手势,
所以,在自然情况下,我们滑动的时候,是响应scrollView的滑动手势的,不会响应navigationController的滑动返回的手势
如何让系统响应返回手势呢,这就用到了
shouldRecognizeSimultaneouslyWithGestureRecognizer 方法,

原理:默认情况下,多个视图中有相同类型的手势的时候,
系统只处理最上层的那个视图的该类型的手势,

但是当我们在上层视图或者下层视图shouldRecognizeSimultaneouslyWithGestureRecognizer
的方法返回YES的时候,是可以支持低层的视图的该类型的手势的,

根据以上原理:如果在最左边的并且向右滑动的时候, 我们让scrolllView的 shouldRecognizeSimultaneouslyWithGestureRecognizer 代理方法
返回YES,那么就支持navigationController的返回手势响应了

当然,因为scrollView 的手势是系统添加的,并且默认的代理对象就是自己(这里要和scrollView的delegate区分开来),即scrollview.pangesture.delegate = scrollView,所以,我们需要自定义一个UIScrollView类型,并且重写他的 shouldRecognizeSimultaneouslyWithGestureRecognizer 方法,
并在最左边向右滑动的时候返回YES, 这样就可以响应导航控制器的
返回方法了

不过这里有个注意的点
就是默认的情况下,如果同时响应两个滑动手势,
就会有这样的表现,页面一边侧滑返回,scrollView同时还向右滚动,这样的体验是我们不想要的,我们有两种结局方案
:1 设置scrollView.bounces = NO,
这样就没有弹性了
2 在scrollView的 gestureRecognizerShouldBegin 手势
代理方法中,当在最左边并且是向右滑动返回的时候,
该方法返回NO,就不会响应scrollView 的滚动了

代码

@implementation TPContentScrollView


//是否支持多手势触发,返回YES,则可以多个手势一起触发方法,返回NO则为互斥.
//是否允许多个手势识别器共同识别,一个控件的手势识别后是否阻断手势识别继续向下传播,默认返回NO;如果为YES,响应者链上层对象触发手势识别后,如果下层对象也添加了手势并成功识别也会继续执行,否则上层对象识别后则不再继续传播
//一句话总结就是此方法返回YES时,手势事件会一直往下传递,不论当前层次是否对该事件进行响应。
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer {
    printf("哈哈哈哈同shouldRecognizeSimultaneouslyWithGestureRecognizer\n");
    if ([self isPanBackAction:gestureRecognizer]) {
        return YES;
    }
    return NO;
    
}

/// 判断是否是全屏的返回手势
- (BOOL)isPanBackAction:(UIGestureRecognizer *)gestureRecognizer {
    
    // 在最左边时候 && 是pan手势 && 手势往右拖
    if (self.contentOffset.x == 0) {
        if (gestureRecognizer == self.panGestureRecognizer) {
            // 根据速度获取拖动方向
            CGPoint velocity = [self.panGestureRecognizer velocityInView:self.panGestureRecognizer.view];
            if(velocity.x>0){
                //手势向右滑动
                return YES;
            }
        }
        
    }
    return NO;
}

// 如果是全屏的左滑返回,那么ScrollView的左滑就没用了,返回NO,让ScrollView的左滑失效
// 不写此方法的话,左滑时,那个ScrollView上的子视图也会跟着左滑的
- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer {
    printf("哈哈哈哈gestureRecognizerShouldBegin\n");
    if ([self isPanBackAction:gestureRecognizer]) {
        return NO;
    }
    return YES;
 
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值