ios - 选择 UITableViewCell 时 UIView backgroundColor 消失

标签 ios uitableview uiview interface-builder

我在界面生成器中构建了一个简单的 tableViewCell。 它包含一个包含图像的 UIView。 现在,当我选择单元格时,会显示默认的蓝色选择背景,但我的 UIView 的 backgroundColor 消失了。

我的 UITableViewCell 的实现文件没有做任何特别的事情。它只是初始化并返回 self ,我在 setSelected 中所做的就是调用 super。

如何让我的 UIView backgroundColor 在 tableView 被选中时显示?

最佳答案

这里的问题是 [super] 实现

- (void) setSelected:(BOOL) selected animated:(BOOL) animated;

将 UITableViewCell 中的所有背景颜色设置为 rgba(0,0,0,0)。为什么?也许让我们都流汗?

并不是整个 View 都消失了(事实证明,如果您更改 View 图层边框属性,这些属性会保留)

这是触摸一个单元格所产生的函数调用序列

  1. 设置突出显示
  2. 触摸结束
  3. 布局 subview
  4. willSelectRowAtIndexPath(委托(delegate)方)
  5. setSelected(!!!这是告诉您所有 View 背景颜色消失的地方)
  6. didSelectRowAtIndexPath(委托(delegate)方)
  7. setSelected(再次)(有趣的是,在此调用中未清除背景颜色。该 super 方法内部发生了什么奇怪的事情?)
  8. layoutSubviews(再次)

所以你的选择是

  1. 覆盖 - (void) setSelected:(BOOL) selected animated:(BOOL) animated; 而不调用 [super setSelected:selected animated:animated]。这将为您提供技术上最正确的实现,因为 a) 代码包含在 UITableViewCell 子类中,并且 b) 因为它只在需要时调用(需要时调用两次,但也许有办法解决)。不利的一面是您必须重新实现 setSelected 的所有必要功能(与不必要的颜色清除功能相反)。现在不要问我如何正确覆盖 setSelected。你的猜测目前和我的一样好(请耐心等待,我会在弄清楚后编辑此答案)。
  2. didSelectRowAtIndexPath 中重新声明背景颜色。这不是很好,因为它把应该是实例代码的东西放在了实例之外。它的优点是只在需要时调用,而不是......
  3. 重新断言 layoutSubviews 中的背景颜色。这一点都不好,因为 layoutSubviews 被调用了一百万次!每次表格刷新,每次滚动,每次你祖母烫发时都会调用它......说真的,一百万次。这意味着有很多不必要的后台重新断言和很多额外的处理开销。从好的方面来说,它将代码放在 UITableViewCell 子类中,这很好。

不幸的是,在 setHighlighted 中重新声明背景颜色没有任何作用,因为 setHighlighted 在所有背景颜色通过第一次调用 setSelected 设置为 [r:0 b:0 g:0 a:0] 之前被调用。

//TODO:对如何重写 setSelected 进行很好的描述(敬请期待)

关于ios - 选择 UITableViewCell 时 UIView backgroundColor 消失,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5222736/

相关文章:

ios - (UITabBarController *)self.window.rootViewController;

ios - 需要像 iOS 中的控件一样制作甘特图,进行绘制或 subview ?

ios - UIView 阴影,cornerradius 不工作

ios - UITapGestureRecognizer 不适用于特定的 [UIView] 数组

objective-c - iOS,openURL 打开奇怪的网页...(欢迎来到 appe.com)

ios - didSelectItem 未被调用

ios - 使用 SSkeychain 存储访问 token

ios - 覆盖第一个 iOS 屏幕的简单方法

iOS 7 TableView 就像 iPad 上的“设置”应用程序中一样

uitableview - ABTableViewCell 选中滞后