为什么UITableViewCell上的UIButton仅在触摸手势持续很短的时间时才会变暗

快速按下button而不保持很短时间,将不会突出显示该button。 不同于普通UIView上的UIButton

就像官方Twitter客户端的头像有同样的问题。
Instagram客户端似乎解决了这个问题,所有的button工作正常

在这里find同样的问题
为什么UIButton在button位于UITableViewCell上时显示TouchWhenHighlighted?

但是我仍然不知道如何解决这个问题。

那么…一个UITableViewUIScrollView的子类,而UIScrollView类已知为触及它自己的目的而触及。
当它意识到触摸不是为了它,它将它传递给它的直接子视图。
functiondelaysContentTouches属性( 默认为YES )。

这就是为什么, UIButton只是在触摸后才显示它的状态,因为触摸事件与UITableView有一段时间的UITableView ,直到它确定触摸是为了滚动还是在滑动单元格,并且意识到两者都不是触摸,它立即将触摸事件传递给它正下方的子subView

在快速点击的情况下,由于该延迟,button的突出显示状态被绕过,并且直接调用目标select器方法。


为了在UITableView显示button的突出显示的状态( 就像它在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的滚动,所以使用你的更好的判断。