为什么UITableViewCell上的UIButton只在触摸手势持续很短的时间内绘制得更暗

时间:2014-01-27 04:00:49

标签: ios uitableview uibutton

快速按下按钮而不是短时间按住,不会突出显示该按钮。 与普通UIButton上的UIView不同。

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

在此处查找相同的问题:
Why doesn't UIButton showsTouchWhenHighlighted work when the button is on a UITableViewCell?

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

1 个答案:

答案 0 :(得分:8)

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

所以,在-viewDidLoad或任何适当的地方,这就是你需要的全部内容:

[yourTableViewObject setDelaysContentTouches:NO];

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