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

Posted

技术标签:

【中文标题】为啥 UITableViewCell 上的 UIButton 仅在触摸手势持续很短时间时才会变暗【英文标题】:Why a UIButton on UITableViewCell only drawn darker when touch gesture continued for a short time为什么 UITableViewCell 上的 UIButton 仅在触摸手势持续很短时间时才会变暗 【发布时间】:2014-01-27 04:00:48 【问题描述】:

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

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

在这里找到相同的问题:Why doesn't UIButton showsTouchWhenHighlighted work when the button is on a UITableViewCell?

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

【问题讨论】:

尝试继承 tableviewcell 并向其添加按钮 【参考方案1】:

嗯...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 的滚动,所以请自行判断。

【讨论】:

如果我将 setDelaysContentTouches 设置为 NO,则在拖动按钮时它不会滚动。我仍然无法弄清楚 Instagram 客户端是如何解决这个问题的。 ***.com/questions/17701323/… 解决了这个问题,我继承了 UITableView,添加了 touchesShouldCancelInContentView: 方法,并且总是返回 YES。但只有当 [myTableViewObject setDelaysContentTouches:NO] 在我分配 tableView 的位置调用时才能正常工作,而不是 UITableView 子类 init 方法。 Xcode 的 Interface Builder 中有一个名为“Cancelable Content Touches”的 TableView 设置,您需要确保它已启用。启用后,它似乎适用于 iOS 7 和上面的代码。

以上是关于为啥 UITableViewCell 上的 UIButton 仅在触摸手势持续很短时间时才会变暗的主要内容,如果未能解决你的问题,请参考以下文章

搜索中的第一个 UITableViewCell UIButton 保持不变

为啥 UITableViewCell 相互重叠?

为啥我必须删除为 UITableViewCell 添加的子视图,而不是在 UITableViewCell 的子类中?

为啥 systemLayoutSizeFittingSize 为 UITableViewCell 返回 (0, 0)?

为啥我的 UITableViewCell 的方向会改变 AutoLayout?

为啥我的自定义 UITableViewCell 没有显示?