嗯...UITableView 是 UIScrollView 的子类,而众所周知,UIScrollView 类会出于自己的目的吃接触。
当它意识到触摸不适合它时,它会将其传递给它的直接子视图。
这个特性是delaysContentTouches属性(默认是YES)。
这就是为什么,UIButton 仅在延长触摸后才显示它的突出显示状态,因为触摸事件与UITableView 一起出现了一小段时间,直到它确定触摸是用于滚动还是滑动单元格并打开意识到触摸两者都不是,它立即将触摸事件传递给它正下方的subView。
在快速点击的情况下,由于这种延迟,按钮的高亮状态会被绕过,直接调用目标选择器方法。
要在 UITableView 中显示按钮的突出显示状态(就像在 UIView 上一样):
对于 iOS7+:
在-viewDidLoad 或任何适当的地方:
[yourTableViewObject setDelaysContentTouches:NO];
另外...cell.subviews 有一个 UITableViewCellScrollView 类,它显然是另一个 scrollView,我们还需要禁用该类的 delaysContentTouches 属性。
所以...在-cellForRowAtIndexPath: 方法中(就在return cell;之前):
NSArray *test = cell.subviews;
for (UIView *currentView in cell.subviews) {
if ([NSStringFromClass([currentView class]) isEqualToString:@"UITableViewCellScrollView"]) {
UIScrollView *svTemp = (UIScrollView *) currentView;
[svTemp setDelaysContentTouches:NO];
break;
}
}
对于 iOS 6-:
在 iOS6 中,cell.subviews 有一个 UITableViewCellContentView 类,它不是 scrollView 的子类,因此只需为 tableView 单独设置一个参数。
所以,在-viewDidLoad 或任何适当的地方,这就是您所需要的:
[yourTableViewObject setDelaysContentTouches:NO];
PS:这样做会扰乱tableView 的滚动,所以请自行判断。