为什么UITableViewCell上的UIButton仅在触摸手势持续很短的时间时才会变暗
快速按下button而不保持很短时间,将不会突出显示该button。 不同于普通UIView
上的UIButton
。
就像官方Twitter客户端的头像有同样的问题。
Instagram客户端似乎解决了这个问题,所有的button工作正常
在这里find同样的问题
为什么UIButton在button位于UITableViewCell上时显示TouchWhenHighlighted?
但是我仍然不知道如何解决这个问题。
那么…一个UITableView
是UIScrollView
的子类,而UIScrollView
类已知为触及它自己的目的而触及。
当它意识到触摸不是为了它,它将它传递给它的直接子视图。
此function是delaysContentTouches
属性( 默认为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
的滚动,所以使用你的更好的判断。