问题描述:
放置了一个UIButton到UITableViewCell当中,点击UIButton,UIButton没有高亮
问题分析:
可以确定的是,UIScrollView 有一个 delaysContentTouches 属性,默认为YES,touch事件会被 delay。
那么把UITableView 的 delaysContentTouches 设置为 YES 应该就行了。
解决方案:
准备工作:
要自定义一个TableView,继承自UITableView
要自定义一个TableViewCell,继承自UITableViewCell
第一步:
[self.tableView setDelaysContentTouches:NO];
结果:会发现没有效果,原来UITableview继承自UIScrollView,这大家都知道,但是UITableview下的 UITableViewWrapperView 也是继承自 UIScrollView,所以看第二步。
第二步:
把UITableView的UITableViewWrapperView也设置一下 delaysContentTouches
for (UIView *currentView in self.tableView.subviews) {
if([currentView isKindOfClass:[UIScrollView class]]) {
((UIScrollView *)currentView).delaysContentTouches = NO;
break;
}
}
结果:运行程序,点击UIButton,可以高亮了,噢,好像这样子就行了。
但是好像有点问题,滑动 Tableview ,手指一放到Cell上,Cell就高亮了,这样也不好吧。这是副作用啊。
第三步:
继承一个 TableViewCell,重写下面的方法,就是这样,不要调用 super 方法;
- (void)setHighlighted:(BOOL)highlighted animated:(BOOL)animated{
}
结果:嗯,Button点击高亮,Cell点击高亮,滑动TableView也正常,好像也可以了。
但是好像还有点问题,按住Button,滑动,只是Button的状态变化了,TableView并没有滑动。
这个是你想要的吗?如果不是,请往下看。
第四步:
在继承自UITableView的自定义TableView当中加入以下代码:
- (BOOL)touchesShouldCancelInContentView:(UIView *)view {
if ([view isKindOfClass:[UIButton class]]) {
return YES;
}
return [super touchesShouldCancelInContentView:view];
}
结果:这下真的好了,貌似一切都正常了。