代码地址如下:
http://www.demodashi.com/demo/13848.html

效果预览

一、前期准备

有一个支持全屏侧滑返回的视图控制器ViewController,ViewController.view上有一个UIScrollView,UIScrollView上有UISlider。俺直接在之前的示例Demo上演示,地址:iOS 自定义转场动画

二、问题展示

  • 现象 1UIScrollView当前在第一页即contentOffset.x=0时,左滑不能触发全屏侧滑pop返回的手势

  • 现象2问题1解决后,你会发现拖拽UIScrollView第一页上的UISlider时,向右拖拽时却触发了全屏侧滑pop返回的手势,而UISlider本身的拖拽事件却没有响应;向左拖拽UISlider时,响应的是UIScrollView的拖动事件,而UISlider本身的拖拽事件也没有响应

  • 现象3当你长按UISlider超过150ms后直接拖拽,就不存在现象2中UISlider与UIScrollView、全屏侧滑返回的冲突问题了

三、分析解决问题

这些问题很显然,肯定跟iOS事件的传递和响应链机制有关系,不了解的可以看看这篇文章 史上最详细的iOS之事件的传递和响应机制-原理篇。

  • 分析解决问题 1
    如果你了解事件的传递和响应链机制的话,应该能想到,是由于UIScrollView的内部手势方法阻断了全屏侧滑返回手势的的响应,那我们就找到这个方法,代码如下

创建一个UIScrollView的类别UIScrollView+GestureConflict,重写如下方法:

//处理UIScrollView上的手势和侧滑返回手势的冲突
-(BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer{// 首先判断otherGestureRecognizer是不是系统pop手势if ([otherGestureRecognizer.view isKindOfClass:NSClassFromString(@"UILayoutContainerView")]) {// 再判断系统手势的state是began还是fail,同时判断scrollView的位置是不是正好在最左边if (otherGestureRecognizer.state == UIGestureRecognizerStateBegan && self.contentOffset.x == 0) {return YES;}}return NO;
}
  • 分析解决问题 2和3

方案一:这个跟UIScrollView的一个属性delaysContentTouches有关。

scrollView.delaysContentTouches = NO;
delaysContentTouches 默认值为YES 表示延迟scrollView上子视图的响应,所以当直接拖动UISlider时,如果此时touch时间在150ms以内,UIScrollView会认为是拖动自己,从而拦截了event,导致UISlider接收不到滑动的event。但是只要长按住UISlider一会儿再拖动,此时touch时间超过150ms,因此滑动的event会发送到UISlider上,然后UISlider再作出响应;设置为NO后,拖动UISlider时就可以直接做出响应,解决了UISlider与UIScrollView之间的冲突,同时也解决了向右拖拽时却触发了全屏侧滑pop返回的问题。

方案二: 重写类别UIScrollView+GestureConflict中的如下方法来解决UISlider与UIScrollView之间的冲突,然后还需要执行下面 问题补充 中的操作来处理UISlider的滑动与全屏侧滑pop返回事件的冲突。

//拦截事件的处理 事件传递给谁,就会调用谁的hitTest:withEvent:方法。
//处理UISlider的滑动与UIScrollView的滑动事件冲突
- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event {/*直接拖动UISlider,此时touch时间在150ms以内,UIScrollView会认为是拖动自己,从而拦截了event,导致UISlider接受不到滑动的event。但是只要按住UISlider一会再拖动,此时此时touch时间超过150ms,因此滑动的event会发送到UISlider上。*/UIView *view = [super hitTest:point withEvent:event];if([view isKindOfClass:[UISlider class]]) {//如果接收事件view是UISlider,则scrollview禁止响应滑动self.scrollEnabled = NO;} else {   //如果不是,则恢复滑动self.scrollEnabled = YES;}return view;
}
  • 问题补充
    示例Demo中的UISlider是在UIScrollView上的,如果UISlider不是在UIScrollView上,而是直接就在ViewController.view上,那也就会出现拖拽UISlider时却响应了全屏侧滑pop返回手势的问题。

在支持全屏侧滑返回的UINavigationController的子类WSLNavigatioController中,遵守协议,实现如下方法:

#pragma mark -- UIGestureRecognizerDelegate
//触发之后是否响应手势事件
//处理侧滑返回与UISlider的拖动手势冲突
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch{//如果手势是触摸的UISlider滑块触发的,侧滑返回手势就不响应if ([touch.view isKindOfClass:[UISlider class]]) {return NO;}return YES;
}

四、应用示例

五、项目结构

好了,俺要去鹊桥跟俺家织女相会咯✌️?(*❦ω❦),就说这么多了,今天七夕节,也祝各位单身猿告白成功,玩的开心?O(∩_∩)O哈哈~

iOS 全屏侧滑/UIScrollView/UISlider间滑动冲突

代码地址如下:
http://www.demodashi.com/demo/13848.html

注:本文著作权归作者,由demo大师发表,拒绝转载,转载需要作者授权

iOS 全屏侧滑/UIScrollView/UISlider间滑动冲突相关推荐

  1. iOS 全屏侧滑手势/UIScrollView/UISlider间滑动手势冲突

    七夕节福利 效果预览 一.前期准备 有一个支持全屏侧滑返回的视图控制器ViewController,ViewController.view上有一个UIScrollView,UIScrollView上有 ...

  2. html中鼠标移动有下拉图片,JQuery自适应全屏图片滚动鼠标上下滑动效果代码

    特效描述:JQuery 自适应全屏 图片滚动 鼠标上下滑动效果.JQuery:全屏随鼠标滑动而滚动 代码结构 1. 引入JS 2. HTML代码 $(function(){ $('body,html' ...

  3. jquery,js实现手机端全屏轮播图手动滑动+自动切换(autoplay)

    jquery,js实现手机端全屏轮播图 使用了swiper插件,可手动滑动切换也可自动切换 效果图 css代码 只是作为参考,可以根据你自己的需求去改,这里我用的是上下两张背景图,图自行修改 html ...

  4. ios 全屏返回手势

    感谢前人的无私奉献.  简书原文 ,  优化有bar,无bar的切换 前言 苹果在IOS7以后给导航控制器增加了一个Pop的手势,只要手指在屏幕边缘滑动,当前的控制器的视图就会跟随你的手指移动,当用户 ...

  5. css3 移动端video视频全屏,横屏展示,适配微信/打包成app

    参考链接: 全屏旋转 https://blog.csdn.net/nidunlove/article/details/51944527 ios进度条滑动方向判断 https://www.cnblogs ...

  6. iOS任何界面全屏炫酷倒计时,一句代码就够了

    概述 iOS全屏炫酷倒计时,任何界面只需要调用一句代码就能实现,支持定制倒计时数字.倒计时结束时显示的文本.支持倒计时播放图片.开始倒计时和结束倒计时的block和delegate回调.支持定制文本颜 ...

  7. (已解决)video标签在ios端默认全屏播放(h5开发)

    Video在ios全屏播放 这两天一直在做h5开发,项目马上完结,就是到最后项目上线之后,在ios上面测试,突然发现原来的视频默认全屏播放,这样就有很大的限制,很不利于开发,我这边是已经解决这个问题了 ...

  8. textureview 缩放_用MediaPlayer+TextureView封装一个完美实现全屏、小窗口的视频播放器...

    原标题:用MediaPlayer+TextureView封装一个完美实现全屏.小窗口的视频播放器 本文作者 本文由xiaoyanger授权发布. xiaoyanger的博客地址: http://www ...

  9. android 播放器封装,Android视频播放最全总结:MediaPlayer+TextureView封装一个完美实现全屏、小窗视频播放器,附项目源码...

    原标题:Android视频播放最全总结:MediaPlayer+TextureView封装一个完美实现全屏.小窗视频播放器,附项目源码 作者:xiaoyanger 来源:http://www.jian ...

最新文章

  1. 死磕Java并发:深入分析ThreadLocal
  2. php ajax 时间戳,获取时间戳 和 备用ajax案例
  3. Java 洛谷 P1308 统计单词数
  4. 计算机网络通信的仿真,计算机网络虚拟仿真技术研究与应用.doc
  5. EasyUI下拉框级联
  6. 工业互联网二级节点建设_建设者还是二传手?
  7. RabbitMQ:计划邮件传递
  8. 线性回归的Spark实现 [Linear Regression / Machine Learning / Spark]
  9. Spring、Spring MVC、MyBatis整合文件配置详解
  10. java supplier_现代化的 Java (二十一)——宏和生成宏
  11. 51Nod 1289 大鱼吃小鱼 栈的简单模拟
  12. 怎么看软件的编写代码
  13. java我的世界1.6.2_我的世界1.6.2
  14. java 传真x2fax_FreeSWITCH的传真发送
  15. 银行合规程序KYC、CDD、AML和TM
  16. ac86u原厂固件去广告_释放更多功能,华硕 AC86U 刷官改固件教程
  17. vscode 注释多行代码_如何在Visual Studio Code中注释多行?
  18. 编写一程序从键盘输入圆锥体的半径r 高度h 并计算其体积
  19. 发一个贷款月供额计算工具[原创]
  20. 已解决ValueError: 4 columns passed, passed data had 2 columns

热门文章

  1. 在python程序中嵌入浏览器_用Python中的wxPython实现最基本的浏览器功能
  2. 3. GD32F103C8T6 GPIO的位带操作
  3. C语言 几种排序方法(冒泡、选择、插入、归并、快速)
  4. 计算机游戏动漫制作自我鉴定,动漫设计专业自我鉴定
  5. 物联网-移远M26模块OpenCPU开发第3讲(看门狗)
  6. “手把手教你学linux驱动开发”OK6410系列之02---虚拟字符设备
  7. 实验大作业c语言实现简单ftp,C 语言实现 FTP 服务器
  8. oracle输入命令为什么显示2,oracle安装后完善2-2 sqlplus配置变量 命令提示符如何显示为用户名...
  9. mysql外建名是随机的吗_创建角色随机名字(mysql抽取随机记录)和mysql游标的使用_MySQL...
  10. 【重难点】【Redis 01】为什么使用 Redis、Redis 的线程模型、Redis 的数据类型及其底层数据结构