iOS 侧滑返回手势与Scrollview冲突的解决办法
程序员文章站
2024-03-24 13:17:10
...
苹果在iOS7.0以后推出了一个侧滑返回手势,当导航栏Push到下一页时,可以通过侧滑手势pop到上一页,这大大提高了用户的体验度,同时增加了可玩性。
然而有些时候,当你push到另一个界面后,如果该界面有Scrollview或继承于Scrollview(tableview,collectionview)的控件,这时你可能会发现返回手势失效了,这个是为什么喃?
经过我多番验证,原来是这个控件拦截了手势(这个地方不清楚的小伙伴可以去看看手势的响应链)。当然,这个对app功能没什么影响,但是基于用户体验来说,这是一个很坏的体验!!
方案一:解决办法就是对Scrollview加个Category,重写它代理的方法,让手势能够传递下去
第一步,新建一个Scrollview的CateGory , 或者继承自UIScrollview
第二步,重写这个方法,让手势能够传递下去
-第三步,就是对是否是左滑返回手势的判断了
最后附上代码:
#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
原文链接 :https://www.jianshu.com/p/419e3b081e5a ,
对方案1进行了改动, 改成了本文的样子
方案2,也试了试,系统返回与Scrollview的左滑冲突还是比较大的,左滑时,很可能只是想看上一页,但是却pop回去了. 不太推荐