iOS 侧滑返回手势与Scrollview冲突的解决办法

网络上找到解决办法会影响到系统tableview和collectionview的滚动,故做一下优化

uiscrollview里面实现:

//是否支持多手势触发,返回YES,则可以多个手势一起触发方法,返回NO则为互斥.
//是否允许多个手势识别器共同识别,一个控件的手势识别后是否阻断手势识别继续向下传播,默认返回NO;如果为YES,响应者链上层对象触发手势识别后,如果下层对象也添加了手势并成功识别也会继续执行,否则上层对象识别后则不再继续传播
//一句话总结就是此方法返回YES时,手势事件会一直往下传递,不论当前层次是否对该事件进行响应。
如果下层对象也添加了手势并成功识别也会继续执行,否则上层对象识别后则不再继续传播
//一句话总结就是此方法返回YES时,手势事件会一直往下传递,不论当前层次是否对该事件进行响应。
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer {
   
    if ([self isPanBackAction:gestureRecognizer]) {
        return YES;
    }
    return NO;
    
}
/// 判断是否是全屏的返回手势
- (BOOL)isPanBackAction:(UIGestureRecognizer *)gestureRecognizer {
    
    if (![[self currentContainer] isKindOfClass:[UIViewController class]]) {
        return NO;
    }
    UIViewController * vc = (UIViewController *)[self currentContainer];
//    fd_interactivePopDisabled  //是否禁止侧滑,参考自己的侧滑实现方式
    if (vc.fd_interactivePopDisabled || vc.navigationController.viewControllers.count <= 1) {
        return NO;
    }
    // 在最左边时候 && 是pan手势 && 手势往右拖
    if (self.contentOffset.x <= 0 && self.contentSize.width > self.frame.size.width) {
        if (gestureRecognizer == self.panGestureRecognizer) {
            // 根据速度获取拖动方向
            CGPoint velocity = [self.panGestureRecognizer translationInView:self.panGestureRecognizer.view];

            if(velocity.x>0){
                //手势向右滑动
                return YES;
            }
        }
        
    }
    return NO;
}


-(UIResponder *)currentContainer{
    
    UIResponder * nextRes = [self nextResponder];
    while (![nextRes isKindOfClass:[UIViewController class]]) {
        nextRes = [nextRes nextResponder];
        if ([nextRes isKindOfClass:[UIWindow class]]) {
            return nextRes;
        }
    }
    return nextRes;
}
 
// 如果是全屏的左滑返回,那么ScrollView的左滑就没用了,返回NO,让ScrollView的左滑失效
// 不写此方法的话,左滑时,那个ScrollView上的子视图也会跟着左滑的
- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer {
 
    if ([self isPanBackAction:gestureRecognizer]) {
        return NO;
    }
    return YES;
 
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值