为什么UITableViewCell上的UIButton只有在触摸手势持续一小段时间时才会变暗



快速按下按钮并且短时间不按住,将不会突出显示该按钮。 不同于普通UIView上的UIButton

就像官方推特客户端中的头像一样,遇到了同样的问题。
Instagram客户端似乎解决了这个问题,所有按钮都可以正常工作。

在这里找到同样的问题:
为什么当按钮位于UITableViewCell上时,UIButton 显示触摸何时突出显示不起作用?

但我仍然不知道如何解决它。

嗯...UITableViewUIScrollView的一个子类,众所周知,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有一个不是scrollView子类的UITableViewCellContentView类,因此只需为tableView设置一个参数即可。

因此,在-viewDidLoad或任何合适的地方,这就是您所需要的:

[yourTableViewObject setDelaysContentTouches:NO];

PS:这样做会弄乱tableView的滚动,所以使用你更好的判断。

最新更新