欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2024-03-24 13:17:10
...

苹果在iOS7.0以后推出了一个侧滑返回手势,当导航栏Push到下一页时,可以通过侧滑手势pop到上一页,这大大提高了用户的体验度,同时增加了可玩性。
然而有些时候,当你push到另一个界面后,如果该界面有Scrollview或继承于Scrollview(tableview,collectionview)的控件,这时你可能会发现返回手势失效了,这个是为什么喃?
经过我多番验证,原来是这个控件拦截了手势(这个地方不清楚的小伙伴可以去看看手势的响应链)。当然,这个对app功能没什么影响,但是基于用户体验来说,这是一个很坏的体验!!

方案一:解决办法就是对Scrollview加个Category,重写它代理的方法,让手势能够传递下去

第一步,新建一个Scrollview的CateGory , 或者继承自UIScrollview

第二步,重写这个方法,让手势能够传递下去

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

-第三步,就是对是否是左滑返回手势的判断了

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

 

最后附上代码:

#import <UIKit/UIKit.h>

@interface BaseScrollView : UIScrollView

@end

#import "BaseScrollView.h"

@implementation BaseScrollView

// 参考链接 : https://www.jianshu.com/p/419e3b081e5a
//是否支持多手势触发,返回YES,则可以多个手势一起触发方法,返回NO则为互斥.
//是否允许多个手势识别器共同识别,一个控件的手势识别后是否阻断手势识别继续向下传播,默认返回NO;如果为YES,响应者链上层对象触发手势识别后,如果下层对象也添加了手势并成功识别也会继续执行,否则上层对象识别后则不再继续传播
//一句话总结就是此方法返回YES时,手势事件会一直往下传递,不论当前层次是否对该事件进行响应。
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer {
   
    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 {

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

}


@end

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

原文链接 :https://www.jianshu.com/p/419e3b081e5a ,

对方案1进行了改动, 改成了本文的样子
方案2,也试了试,系统返回与Scrollview的左滑冲突还是比较大的,左滑时,很可能只是想看上一页,但是却pop回去了.  不太推荐

 


 

相关标签: UI相关