scroolView按钮高亮延迟问题解决
来源:互联网 发布:日本大学文科专业 知乎 编辑:程序博客网 时间:2024/04/29 02:07
iOS7/8 UIButton高亮状态延迟问题全解
为此我用了一下午时间查贴整理,得到了完美的解决方案。
在介绍解决方案前,必须先科普一些事实,帮助大家理解:
UIScrollView:
1、属性delaysContentTouches,布尔类型,默认值为YES。值为YES时,UIScrollView会在接收到手势时延迟150ms来判断该手势是否能够出发UIScrollView的滑动事件;值为NO时,UIScrollView会立马将接收到的手势分发到子视图上。
(注:仅仅设置这个是不够的,你会发现如果想要拖动scrollView而起点落在其他有手势识别的视图上时会拖不动)
2、方法- (BOOL)touchesShouldCancelInContentView:(UIView *)view,此方法的重载是帮助我们完美解决问题的重点,决定手势是否取消传递到view上,拖动ScrollView时触发。返回NO时,拖动手势将留在ScrollView上,返回YES则将手势传到view上。(若view是UIControl,则默认返回YES)
UITableView:
不得不说,UITableView(包括UITableViewCell在内)在iOS7和iOS8中的视图结构是不同的,且存在着很多我们在编码时永远接触不到的视图,但我们可通过Debug将其subviews逐个逐个找出来。这关系到我们这个问题坑比较深的层次。
iOS7:UITableView中存在n+1个UIScrollView,一个是UITableView本身,另外n个存在于UITableViewCell与cell的contentView之间,类名为UITableViewCellScrollView,活的不久,仅存在于iOS7中,在iOS8中已被移除。
iOS8:UITableView中存在2个UIScrollView,一个是UITableView本身,另外一个存在于UITableView与UITableViewCell之间,类名为UITableViewWrapperView。需要注意的是,UITableViewWrapperView在iOS7中并不是一个UIScrollView。
科普知识完,那么我们就有了以下的问题解决方案了:
1、将UIButton所有属于UIScrollView的父视图的delaysContentTouches属性设置成为NO。
2、继承UIScrollView或UITableView,并重写- (BOOL)touchesShouldCancelInContentView:(UIView*)view方法,让其响应拖动方法。
以下是参考代码:
为了简便我将两个类的子类写在同一个文件中
NoDelayButtonScrollView.m(1):
NoDelayButtonScrollView.m(2):
以上分别对UIScrollView和UITableView进行继承,重写initWithCoder:方法可保证使用Nib文件也能生效
使用这两个类继承写出来的ScrollView和TableView都能快速响应子Button的TouchDown事件,并显示高亮
但以上代码仍未能解决iOS7下UITableView的子Button高亮延迟问题。
可加入以下代码来解决:
这段代码可加在Custom的UITableViewCell的initWithCoder:方法中,也可以放在UITableViewDelegate的cellForRowAtIndexPath:方法中设置对应cell中的UITableViewCellScrollView。
以上,是所有帮助你解决Button延迟高亮问题的方法。
估计很多码友都遇到过这样的情况:
UIButton在某些情况下不能立刻响应TouchDown事件,换句话说,迅速点击按钮时,你是永远看不见这个按钮的高亮状态的。
而你会发现,出现这种情况时,这些按钮都在UIScrollView(UITableView)上。为此我用了一下午时间查贴整理,得到了完美的解决方案。
在介绍解决方案前,必须先科普一些事实,帮助大家理解:
UIScrollView:
1、属性delaysContentTouches,布尔类型,默认值为YES。值为YES时,UIScrollView会在接收到手势时延迟150ms来判断该手势是否能够出发UIScrollView的滑动事件;值为NO时,UIScrollView会立马将接收到的手势分发到子视图上。
(注:仅仅设置这个是不够的,你会发现如果想要拖动scrollView而起点落在其他有手势识别的视图上时会拖不动)
2、方法- (BOOL)touchesShouldCancelInContentView:(UIView *)view,此方法的重载是帮助我们完美解决问题的重点,决定手势是否取消传递到view上,拖动ScrollView时触发。返回NO时,拖动手势将留在ScrollView上,返回YES则将手势传到view上。(若view是UIControl,则默认返回YES)
UITableView:
不得不说,UITableView(包括UITableViewCell在内)在iOS7和iOS8中的视图结构是不同的,且存在着很多我们在编码时永远接触不到的视图,但我们可通过Debug将其subviews逐个逐个找出来。这关系到我们这个问题坑比较深的层次。
iOS7:UITableView中存在n+1个UIScrollView,一个是UITableView本身,另外n个存在于UITableViewCell与cell的contentView之间,类名为UITableViewCellScrollView,活的不久,仅存在于iOS7中,在iOS8中已被移除。
iOS8:UITableView中存在2个UIScrollView,一个是UITableView本身,另外一个存在于UITableView与UITableViewCell之间,类名为UITableViewWrapperView。需要注意的是,UITableViewWrapperView在iOS7中并不是一个UIScrollView。
科普知识完,那么我们就有了以下的问题解决方案了:
1、将UIButton所有属于UIScrollView的父视图的delaysContentTouches属性设置成为NO。
2、继承UIScrollView或UITableView,并重写- (BOOL)touchesShouldCancelInContentView:(UIView*)view方法,让其响应拖动方法。
以下是参考代码:
为了简便我将两个类的子类写在同一个文件中
NoDelayButtonScrollView.h:
NoDelayButtonScrollView.m(1):
NoDelayButtonScrollView.m(2):
以上分别对UIScrollView和UITableView进行继承,重写initWithCoder:方法可保证使用Nib文件也能生效
使用这两个类继承写出来的ScrollView和TableView都能快速响应子Button的TouchDown事件,并显示高亮
但以上代码仍未能解决iOS7下UITableView的子Button高亮延迟问题。
可加入以下代码来解决:
这段代码可加在Custom的UITableViewCell的initWithCoder:方法中,也可以放在UITableViewDelegate的cellForRowAtIndexPath:方法中设置对应cell中的UITableViewCellScrollView。
以上,是所有帮助你解决Button延迟高亮问题的方法。
0 0
- scroolView按钮高亮延迟问题解决
- ScroolView中的ListView冲突问题解决方案
- 5800 闹钟延迟问题解决
- jpa hibernate延迟问题解决
- iOS点击按钮高亮
- ios取消按钮高亮
- scroolView嵌套listview时listView只显示一条item的高,并且还能滑动问题
- iOS7/8 UIButton高亮状态延迟问题全解
- IOS 开发 Swfit UIbutton高亮延迟处理方法
- iOS7/8 UIButton高亮状态延迟问题全解
- UIButton高亮状态延迟问题全解
- 按钮点击的延迟处理
- 按钮延迟点击的代码
- 多个按钮其中被按下按钮高亮显示
- 【问题解决】Octopress之代码高亮
- 代码实现按钮点击高亮效果
- Feathers组件--之--高亮按钮
- iOS 背景图片。按钮高亮自定义背景
- Masonry自动布局使用
- 获取设置android系统手机的铃声和音量
- net-snmp-5.7.3配置编译安装
- Hexo带过滤功能的首页插件
- CSS Secret——Structure & Layout
- scroolView按钮高亮延迟问题解决
- 342. Power of Four
- U3D报错:Screen position out of view frustum
- 数据类操作之SharedPreferences(保存用户偏好参数)
- 【图像基础】相似性变换、放射变换与单应性
- HTML5画布(CANVAS)速查简表
- oracle游标全解2
- lua遍历table
- Android热修复---AndFix