iOS 下如果存在UIScrollerView 使用UIScreenEdgePanGestureRecognizer实现侧滑效果失效的问题...
当你在使用UIScreenEdgePanGestureRecognizer手势实现侧滑的时候,如果后期你导航控制器push出的界面中包含UIScrollerView,这个时候你会发现,侧滑效果无法实现了,这个首先你会想到肯定是UIScrollerView,把这个手势给拦截了,执行了UIScrollerView中包含的手势。
问题所在
滑动返回事实上也是由于存在已久的UIScreenEdgePanGestureRecognizer来识别并且相应地,它直接与UINavigationController的view进行了绑定,绑定的方法是写在UINavgationController 的基类中的,正如一下:
UIPanGestureRecongnizer -- bind-- UIScrollerView
UIScreenEdgePanGestureRecognizer --bind-- UINavigationController.view
滑动返回无法触发,说明UIScreenEdgePanGestureRecongnizer并没有接受到手势事件。
根据苹果的官方文档说明 UIGestureRecongnizer 和UIview 是多对一的关系,UIGestureRecognizer 一定要和UIView进行绑定才能发挥作用,因此UIGestureRecongnizer对于屏幕上的手势事件,其接受顺序和UIView的层次结构是一致的,如下关系
UINavgataionController.view -->UIviewController.view -- > UIScrollerView.view -->screen and user'finger 既UIScrollView的panGestureRecognizer
先接受到了手势事件,直接就处理而没有往下传递实际上就是两个手势共存的问题
解决方案
UIGestureRecognizerDelegate 代理方法中包含,支持多个UIGestureRecongnizer共存,其中一个方法是
1 // called when the recognition of one of gestureRecognizer or otherGestureRecognizer would be blocked by the other
2 // return YES to allow both to recognize simultaneously. the default implementation returns NO (by default no two gestures can be recognized simultaneously) 3 // 4 // note: returning YES is guaranteed to allow simultaneous recognition. returning NO is not guaranteed to prevent simultaneous recognition, as the other gesture's delegate may return YES 5 - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer;
总结就是此方法返回YES,手势事件会一直往下传递,不论当前层次是否对该事件进行响应
看看UIScrollerView的头文件的描述:
1 // Use these accessors to configure the scroll view's built-in gesture recognizers.
2 // Do not change the gestures' delegates or override the getters for these properties.
3 @property(nonatomic, readonly) UIPanGestureRecognizer *panGestureRecognizer NS_AVAILABLE_IOS(5_0);
UIScrollView本身是其panGestureRecognizer的delegate,且apple君明确表明不能修改它的delegate(修改的时候也会有警告)
UIScrollView作为delegate,说明UIScrollView中实现了上文提到的shouldRecognizeSimultaneouslyWithGestureRecognizer方法,返回了NO。创建一个UIScrollView的category,由于category中的同名方法会覆盖原有.m文件中的实现,使得可以自定义手势事件的传递,如下:
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer{ if ([gestureRecognizer isKindOfClass:[UIPanGestureRecognizer class]] && [otherGestureRecognizer isKindOfClass:[UIScreenEdgePanGestureRecognizer class]]) { return YES; } else { return NO; } }
转载于:https://www.cnblogs.com/Ice-snowPride/p/5337239.html
iOS 下如果存在UIScrollerView 使用UIScreenEdgePanGestureRecognizer实现侧滑效果失效的问题...相关推荐
- iOS下拉tableView实现上面的图片放大效果
#import "ViewController.h" #define kScreenbounds [UIScreen mainScreen].bounds #define kScr ...
- iOS添加边缘手势( UIScreenEdgePanGestureRecognizer)实现侧滑效果
通过添加边缘手势来实现侧滑的效果,类似于qq界面的边缘侧滑 ,亦或广告界面的侧滑 @interface中定义一个全局view @property(nonatomic,weak)UIView *adVi ...
- iOS下JS与OC互相调用(五)--UIWebView + WebViewJavascriptBridge
WebViewJavascriptBridge是一个有点年代的JS与OC交互的库,使用该库的著名应用还挺多的,目前这个库有7000+star.我去翻看了它的第一版本已经是4年前了,在版本V4.1.4以 ...
- iOS下JS与OC互相调用(一)--UIWebView 拦截URL
1.在JS 中做一次URL跳转,然后在OC中拦截跳转.(这里分为UIWebView 和 WKWebView两种,去年因为还要兼容iOS 6,所以没办法只能采用UIWebView来做.) 2.利用WKW ...
- iOS下bound,center和frame
---恢复内容开始--- 本文转发至:http://www.xuebuyuan.com/1846606.html 在写程序的时候发现,iOS下的坐标.位置很容易弄乱,特别是在不同的坐标系统中,必须完成 ...
- Mac下python3配置opencv3 3和Mac下单独opencv的配置以及iOS下配置opencv
#1.Mac下python3配置opencv3.3 新手受任开发一个功能,需要用到opencv.但python和opencv连接出现问题,看了大概有上百份博客的解决办法,都没有解决,快要放弃了,解决了 ...
- iOS下的 Fixed BUG
input 光标位置乱窜 固定式浮层内的输入框光标会发生偏移.即 fixed 定位的容器中输入框光标的位置显示不正确,没有正常地显示在输入框中,而是偏移到了输入框外面 可触发条件 页面body出现滚动 ...
- web移动端Fixed在Input获取焦点时ios下产生的BUG及处理
1.现象 可以看到下面两张图,图1搜索框为fixed固定在顶部,滚动没有任何问题. 图2当光标进入搜索框时,ios自作聪明的把光标定位到中间,并且fixed属性被自动修改成了absolute.此时注意 ...
- Quill编辑器IOS下无法获取焦点的解决方法
Quill编辑器IOS下无法获取焦点的解决方法 参考文章: (1)Quill编辑器IOS下无法获取焦点的解决方法 (2)https://www.cnblogs.com/slmk/p/8618296.h ...
最新文章
- 010_Post请求中文乱码
- JSP EL表达式 格式化日期
- 字典树实现_学习NLP的第3天——字典树
- (数据库系统概论|王珊)第四章数据库安全性:习题
- 原子变量的原理与应用
- opencv _rect
- html实现省市县选择,jQuery ajax实现省市县三级联动
- Python内置函数一览表
- PS2019 常用快捷键大全
- 粗谈全息投影与裸眼3D
- ubuntu16.04+gtx1050驱动安装记录
- Redis系列:Redis持久化机制与Redis事务
- Flutter实战之go_router路由组件入门指南
- 个人作业——A002-185-2513-吴光华
- 简报 | 呼吁建立全球性加密货币征税体系和法规 或在2020年最终敲定
- 剑指offer_递归与循环---跳台阶
- java操作txt文本(二):删除文本括号内的内容
- Adb 查询手机信息
- Navicat Premium导入导出sql文件
- R16开发板tina系统LCD调试
热门文章
- Unity中uGUI的控件事件穿透逻辑
- hdu4418 概率dp+高斯消元(近日吐槽)
- JSLint JavaScript代码质量审查工具汉化中文版隆重发布
- Windbg 查看SSDT表
- oracle parameterfile
- 【新手入门篇】新浪微博应用开发之Java入门篇
- 查看mysql数据插入时间_[译] MySQL 最佳实践 —— 高效插入数据
- vue和小程序哪个好学一点_litemall,Spring Boot后端,微信小程序用户前端 + Vue用户移动端...
- 搭建负载均衡器nginx_为什么要使用NGINX作为负载均衡器?
- java 保存和读取本地文件