当你在使用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实现侧滑效果失效的问题...相关推荐

  1. iOS下拉tableView实现上面的图片放大效果

    #import "ViewController.h" #define kScreenbounds [UIScreen mainScreen].bounds #define kScr ...

  2. iOS添加边缘手势( UIScreenEdgePanGestureRecognizer)实现侧滑效果

    通过添加边缘手势来实现侧滑的效果,类似于qq界面的边缘侧滑 ,亦或广告界面的侧滑 @interface中定义一个全局view @property(nonatomic,weak)UIView *adVi ...

  3. iOS下JS与OC互相调用(五)--UIWebView + WebViewJavascriptBridge

    WebViewJavascriptBridge是一个有点年代的JS与OC交互的库,使用该库的著名应用还挺多的,目前这个库有7000+star.我去翻看了它的第一版本已经是4年前了,在版本V4.1.4以 ...

  4. iOS下JS与OC互相调用(一)--UIWebView 拦截URL

    1.在JS 中做一次URL跳转,然后在OC中拦截跳转.(这里分为UIWebView 和 WKWebView两种,去年因为还要兼容iOS 6,所以没办法只能采用UIWebView来做.) 2.利用WKW ...

  5. iOS下bound,center和frame

    ---恢复内容开始--- 本文转发至:http://www.xuebuyuan.com/1846606.html 在写程序的时候发现,iOS下的坐标.位置很容易弄乱,特别是在不同的坐标系统中,必须完成 ...

  6. Mac下python3配置opencv3 3和Mac下单独opencv的配置以及iOS下配置opencv

    #1.Mac下python3配置opencv3.3 新手受任开发一个功能,需要用到opencv.但python和opencv连接出现问题,看了大概有上百份博客的解决办法,都没有解决,快要放弃了,解决了 ...

  7. iOS下的 Fixed BUG

    input 光标位置乱窜 固定式浮层内的输入框光标会发生偏移.即 fixed 定位的容器中输入框光标的位置显示不正确,没有正常地显示在输入框中,而是偏移到了输入框外面 可触发条件 页面body出现滚动 ...

  8. web移动端Fixed在Input获取焦点时ios下产生的BUG及处理

    1.现象 可以看到下面两张图,图1搜索框为fixed固定在顶部,滚动没有任何问题. 图2当光标进入搜索框时,ios自作聪明的把光标定位到中间,并且fixed属性被自动修改成了absolute.此时注意 ...

  9. Quill编辑器IOS下无法获取焦点的解决方法

    Quill编辑器IOS下无法获取焦点的解决方法 参考文章: (1)Quill编辑器IOS下无法获取焦点的解决方法 (2)https://www.cnblogs.com/slmk/p/8618296.h ...

最新文章

  1. 010_Post请求中文乱码
  2. JSP EL表达式 格式化日期
  3. 字典树实现_学习NLP的第3天——字典树
  4. (数据库系统概论|王珊)第四章数据库安全性:习题
  5. 原子变量的原理与应用
  6. opencv _rect
  7. html实现省市县选择,jQuery ajax实现省市县三级联动
  8. Python内置函数一览表
  9. PS2019 常用快捷键大全
  10. 粗谈全息投影与裸眼3D
  11. ubuntu16.04+gtx1050驱动安装记录
  12. Redis系列:Redis持久化机制与Redis事务
  13. Flutter实战之go_router路由组件入门指南
  14. 个人作业——A002-185-2513-吴光华
  15. 简报 | 呼吁建立全球性加密货币征税体系和法规 或在2020年最终敲定
  16. 剑指offer_递归与循环---跳台阶
  17. java操作txt文本(二):删除文本括号内的内容
  18. Adb 查询手机信息
  19. Navicat Premium导入导出sql文件
  20. R16开发板tina系统LCD调试

热门文章

  1. Unity中uGUI的控件事件穿透逻辑
  2. hdu4418 概率dp+高斯消元(近日吐槽)
  3. JSLint JavaScript代码质量审查工具汉化中文版隆重发布
  4. Windbg 查看SSDT表
  5. oracle parameterfile
  6. 【新手入门篇】新浪微博应用开发之Java入门篇
  7. 查看mysql数据插入时间_[译] MySQL 最佳实践 —— 高效插入数据
  8. vue和小程序哪个好学一点_litemall,Spring Boot后端,微信小程序用户前端 + Vue用户移动端...
  9. 搭建负载均衡器nginx_为什么要使用NGINX作为负载均衡器?
  10. java 保存和读取本地文件