iOS 侧滑返回手势与Scrollview冲突的解决办法
2017-06-15 本文已影响2151人
AmumuHandsome
苹果在iOS7.0以后推出了一个侧滑返回手势,当导航栏Push到下一页时,可以通过侧滑手势pop到上一页,这大大提高了用户的体验度,同时增加了可玩性。
然而有些时候,当你push到另一个界面后,如果该界面有Scrollview或继承于Scrollview(tableview,collectionview)的控件,这时你可能会发现返回手势失效了,这个是为什么喃?
经过我多番验证,原来是这个控件拦截了手势,也就是说引起了冲突,把我的手势占为己有了。当然,这个对app本身没什么影响,但是对于有强迫症的我还是逼迫自己去找解决办法,因为用户体验很重要!!
大概思路就是,既然你拦截了我的手势,那我就要想办法让手势传递下去,不被你拦截,所以最后的解决办法就是对Scrollview加个Category,重写它代理的方法,让手势能够传递下去
- 第一步,新建一个Scrollview的CateGory
![](https://img.haomeiwen.com/i4421183/982b4252e4a1675b.png)
- 第二步,重写这个方法,让手势能够传递下去
![](https://img.haomeiwen.com/i4421183/b1a72c9e9c60b74a.png)
-第三步,就是对手势进行自定义,可以根据需求设置(可以设置侧滑手势的有效范围)
![](https://img.haomeiwen.com/i4421183/fd2617372c146470.png)
-最后你就会见证神奇的一刻了。
最后附上代码:
#define IPHONE_H [UIScreen mainScreen].bounds.size.height //屏幕的高度
#define IPHONE_W [UIScreen mainScreen].bounds.size.width // 屏幕的宽度
//一句话总结就是此方法返回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 =0.15*IPHONE_W;
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];
//这是允许每张图片都可实现滑动返回
int temp1 = location.x;
int temp2 =IPHONE_W;
NSInteger XX = temp1 % temp2;
if (point.x >0 && XX < location_X) {
return YES;
}
//下面的是只允许在第一张时滑动返回生效
// if (point.x > 0 && location.x < location_X && self.contentOffset.x <= 0) {
// return YES;
// }
}
}
return NO;
}
- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer {
if ([self panBack:gestureRecognizer]) {
return NO;
}
return YES;
}
附上最后效果图
![](https://img.haomeiwen.com/i4421183/a7cd0bdafc52f664.gif)