IOS开发入门之解决右滑返回手势和UIScrollView中的手势冲突
白羽 2018-11-26 来源 :网络 阅读 983 评论 0

摘要:本文将带你了解IOS开发入门解决右滑返回手势和UIScrollView中的手势冲突,希望本文对大家学IOS有所帮助。

    本文将带你了解IOS开发入门解决右滑返回手势和UIScrollView中的手势冲突,希望本文对大家学IOS有所帮助。



        

iOS系统中,滑动返回手势,其实是一个UIPanGestureRecognizer,系统默认的操作是只有滑动屏幕的左边的某个位置,UIPanGestureRecognizer才会起作用。UIScrollView的滑动手势也是UIPanGestureRecognizer。UIGestureRecognizer和UIView是多对一的关系(具体点这里),UIGestureRecognizer一定要和view进行绑定才能发挥作用。因此不难想象,UIGestureRecognizer对于屏幕上的手势事件,其接收顺序和UIView的层次结构是一致的

UINavigationController.view —> UIViewController.view —> UIScrollView —> Screen and User's finger

即UIScrollView的panGestureRecognizer先接收到了手势事件,直接就地处理而没有往下传递。

实际上这就是两个panGestureRecognizer共存的问题。

由于scrollView的滑动手势拦截了事件,那我重写scrollView中panGestureRecognizer的代理方法,让它不拦截就好了嘛。于是继承UIScrollView,重写下面的方法。



   

//一句话总结就是此方法返回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 = 100;

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];

if (point.x > 0 && location.x < location_X && self.contentOffset.x <= 0) {

return YES;

}

}

}

return NO;}

   

需要侧边滑动时 panBack 返回YES,这时候,我让scrollView的手势和页面的滑动返回手势共存,scrollView不拦截手势,那不就可以滑动返回了吗。好了,测试一下,可以滑动返回,但是滑动返回时,scrollView也跟着在滑动呢,我们应该让scrollView切换的时候相应panGesture,滑动返回的时候不响应,那重写scrollView中的另外一个panGestureRecognizer的代理方法。


   

- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer {

 

if ([self panBack:gestureRecognizer]) {

 

return NO;

 

}

 

return YES;

 

}

   

以上的代码都是在一个自定义的UIScrollView上的,重写上面的方法即可。然后让横向滚动的scrollView继承这个自定义UIScrollView就OK了。

另外要注意重写的自定义的UIScrollView要记得实现协议UIGestureRecognizerDelegate

原理:
scrollView的pan手势会让系统的pan手势失效,所以我们只需要在系统手势失效且scrollView的位置在初始位置的时候让两个手势同时启用就可以了。

          

本文由职坐标整理并发布,希望对同学们有所帮助。了解更多详情请关注职坐标移动开发之IOS频道!


本文由 @白羽 发布于职坐标。未经许可,禁止转载。
喜欢 | 0 不喜欢 | 1
看完这篇文章有何感觉?已经有1人表态,0%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved

208小时内训课程