我在界面生成器中构建了一个简单的 tableViewCell 。
它包含一个包含图像的 UIView。
现在,当我选择单元格时,会显示默认的蓝色选择背景,但 UIView 的背景颜色消失了。
我的 UITableViewCell 的实现文件没有做任何特别的事情。它只是 init's & 返回 self 而我在 setSelected 中所做的就是调用 super。
当选择 tableView 时,如何让 UIView 背景颜色显示?
这里的问题是 [super] 实现
- (void) setSelected:(BOOL) selected animated:(BOOL) animated;
将 UITableViewCell 中的所有背景颜色设置为 rgba(0,0,0,0)。为什么?也许让我们都流汗?
这并不是整个视图消失(事实证明,如果更改视图图层边框属性,这些属性将被保留)
以下是触摸单元格导致的函数调用序列
- 设置突出显示
- 触摸结束
- 布局子视图
- willSelectRowAtIndexPath(委托方)
- setSelected(!!!这是所有视图背景颜色被告知消失的地方)
- didSelectRowAtIndexPath(委托方)
- setSelected(再次)(有趣的是,这次调用没有清除背景颜色。那个超级方法内部发生了什么奇怪的事情?)
- 布局子视图(再次)
所以你的选择是
- 覆盖- (void) setSelected:(BOOL) 选择动画:(BOOL) 动画;不打电话[超级设置Selected:选中动画:animated]。这将为您提供技术上最正确的实现,因为 a) 代码包含在 UITableViewCell 子类中,b) 因为它仅在需要时调用(需要时调用两次,但也许有一种解决方法)。缺点是您必须重新实现 setSelected 的所有必要功能(而不是不必要的颜色清除功能)。现在不要问我如何正确覆盖 setSelected。现在你的猜测和我的一样好(请耐心等待,一旦我弄清楚,我就会编辑这个答案)。
- 重新声明背景颜色didSelectRowAtIndexPath。这并不是很好,因为它将应该是实例代码的内容放在了实例之外。它的优点是仅在需要时才调用它,而不是......
- 重新声明背景颜色布局子视图。这一点都不好,因为 layoutSubviews 被调用了大约一百万次!每当表格刷新、每次滚动、每次你祖母烫发时,它都会被调用……说真的,一百万次。这意味着存在大量不必要的后台重新断言和大量额外的处理开销。从好的方面来说,它将代码放在 UITableViewCell 子类中,这很好。
不幸的是,在 setHighlighted 中重新声明背景颜色不会执行任何操作,因为在第一次调用 setSelected 将所有背景颜色设置为 [r:0 b:0 g:0 a:0] 之前调用 setHighlighted。
//TODO:给出关于如何重写 setSelected 的详细描述(敬请关注)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)