UITableView或UIScrollVIew上的UIButton的高亮效果
UITableView或UIScrollVIew上的UIButton的高亮效果
原文地址:http://www.jianshu.com/p/b4331f06bd34
苹果官方的文档解释:default is YES. if NO, we immediately call -touchesShouldBegin:withEvent:inContentView:. this has no effect on presses
很明显,delaysContentTouches 默认值为YES,即UIScrollView会在接受到手势是延迟150ms来判断该手势是否能触发UIScrollView的滑动事件;反之值为NO时,UIScrollView会立马将接受到的手势分发到子视图上。
当然,delaysContentTouches设置为NO是远远不够的,因为这样的话你想要拖动UIScrollView而七点落在替他有手势识别的视图上是会拖不动的。 于是我们要重载touchesShouldCancelInContentView,此方法决定手势是否取消传递到View上,拖动UIScrollView是触发。返回NO时,拖动手势将留在UIScrollView上;返回YES时,则传到View上。
现在,方案就很明确了,我们只要将UIButton所有属于UIScrollView的父视图的delaysContentTouches属性设置成为NO且重写touchesShouldCancelInContentView方法就行。下面直接贴代码
- (instancetype)initWithCoder:(NSCoder *)aDecoder {
self = [super initWithCoder:aDecoder];
if (self) {
self.delaysContentTouches = NO;
}
return self;
}
- (instancetype)initWithFrame:(CGRect)frame {
self = [super initWithFrame:frame];
if (self) {
self.delaysContentTouches = NO;
}
return self;
}
- (BOOL)touchesShouldCancelInContentView:(UIView *)view {
if ([view isKindOfClass:[UIButton class]]) {
return YES;
}
return [super touchesShouldCancelInContentView:view];
}
这就是UIScrollView的让UIButton高亮方法,然而UITableview相比更加复杂些
UITableView:
在iOS7和iOS8中的视图结构是不同的,且存在着很多我们在编码时永远接触不到的视图,但我们可通过Debug将其subviews逐个逐个找出来。这关系到我们这个问题坑比较深的层次。
iOS7:UITableView中存在n+1个UIScrollView,一个是UITableView本身,另外n个村在于UITableViewCell月cell的contenView之间,类名为UITableVieCellScrollVIew,在iOS8已经移除。
iOS8:UITableView中存在2个UIScrollView,一个是UITableView本身,另外一个存在于UITableView与UITableViewCell之间,类名为UITableViewWrapperView。需要注意的是,UITableViewWrapperView在iOS7中并不是一个UIScrollView。
理解后直接贴代码
@implementation ResponseTableView
- (instancetype) initWithCoder : (NSCoder *) aDecoder
{
self = [super initWithCoder:aDecoder];
if (self) {
self.delaysContentTouches = NO;
//因为 UITableViewWrapperView 在iOS7不属于UIScrollView
//iOS7
for (id obj in self.subviews) {
if ([NSStringFromClass([obj class]) isEqualToString:@"UITableViewCellScrollView"]) {
UIScrollView *scrollView = (UIScrollView *) obj;
scrollView.delaysContentTouches = NO;
break;
}
}
//ios 8
for (id view in self.subviews) {
if ([NSStringFromClass([view class]) isEqualToString:@"UITableViewWrapperView"]) {
if ([view isKindOfClass:[UIScrollView class]]) {
UIScrollView *scrollView = (UIScrollView *) view;
scrollView.delaysContentTouches = NO;
}
break;
}
}
}
return self;
}
- (BOOL) touchesShouldCancelInContentView : (UIView *) view {
if ([view isKindOfClass:[UIButton class]]) {
return YES;
}
return [super touchesShouldCancelInContentView:view];
}
以上,就能解决Button延迟高亮的方法.
最新文章
- 【leetcode】Spiral Matrix
- 【OpenWRT】【RT5350】【一】OpenWrt开发环境搭建
- poj-1611-The Suspects
- linux下proc里关于磁盘性能的参数
- Delphi出现“borland license information was found,but it is not valid for delphi”的错误,无法运行的解决方法
- Linux之档案管理
- 3.Knockout.Js(属性绑定)
- Java Scoket编程
- 使用C++名单在文档处理和学生成绩管理系统相结合
- override与重载(overload)的区别
- python selenium-webdriver 元素操作之键盘操作(五)
- nagios 配置 check_traffic 流量监控模块(被监控端)
- css学习_css常见属性用法
- Apache beam中的便携式有状态大数据处理
- Android学习之基础知识二(build.gradle文件详解)
- ubuntu系统:插入优盘read-only file system
- #leetcode刷题之路27-移除元素
- Knockout双向绑定
- 『SharePoint 2010』Sharepoint 2010 Form 身份认证的实现(基于SQL)
- Go语言备忘录(2):反射的原理与使用详解
热门文章
- 【结果很简单,过程很艰辛】记阿里云Ons消息队列服务.NET接口填坑过程
- Android总结之json解析(FastJson Gson 对比)
- 感恩回馈,《ASP.NET Web API 2框架揭秘》免费赠送
- Percona博客学习总结
- Java多线程系列--“JUC锁”02之 互斥锁ReentrantLock
- Tomcat服务器本地的搭建,以及在 IDEA软件下的配置,以及项目的测试运行(基于supermvc框架下的web)
- Java中的反射机制
- MongoDB性能优化
- Effective java笔记(十),序列化
- C# GDI+ 处理文本的两个小技巧