我在界面生成器中构建了一个简单的 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 图层边框属性,这些属性会保留)
这是触摸一个单元格所产生的函数调用序列
- 设置突出显示
- 触摸结束
- 布局 subview
- willSelectRowAtIndexPath(委托(delegate)方)
- setSelected(!!!这是告诉您所有 View 背景颜色消失的地方)
- didSelectRowAtIndexPath(委托(delegate)方)
- setSelected(再次)(有趣的是,在此调用中未清除背景颜色。该 super 方法内部发生了什么奇怪的事情?)
- layoutSubviews(再次)
所以你的选择是
- 覆盖 - (void) setSelected:(BOOL) selected animated:(BOOL) animated; 而不调用 [super setSelected:selected animated:animated]。这将为您提供技术上最正确的实现,因为 a) 代码包含在 UITableViewCell 子类中,并且 b) 因为它只在需要时调用(需要时调用两次,但也许有办法解决)。不利的一面是您必须重新实现 setSelected 的所有必要功能(与不必要的颜色清除功能相反)。现在不要问我如何正确覆盖 setSelected。你的猜测目前和我的一样好(请耐心等待,我会在弄清楚后编辑此答案)。
- 在 didSelectRowAtIndexPath 中重新声明背景颜色。这不是很好,因为它把应该是实例代码的东西放在了实例之外。它的优点是只在需要时调用,而不是......
- 重新断言 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/