我在接口(interface)构建器中有一个简单的tableViewCell构建。
它包含一个UIView,其中包含一个图像。
现在,当我选择单元格时,将显示默认的蓝色选择背景,但是UIView的backgroundColor消失了。

我的UITableViewCell的实现文件没有做任何特殊的事情。它只是init的&返回self,而我在setSelected中所做的就是调用super。

如何让我的UIView的backgroundColor时选择的tableView时,说明了什么?

最佳答案

这里的问题是[super]实现

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

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

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

这是触摸单元格所产生的函数调用顺序
  • set突出显示
  • touches结束了
  • 布局 subview
  • willSelectRowAtIndexPath(代表端)
  • setSelected(!!!这是告诉您所有 View 背景颜色消失的地方)
  • didSelectRowAtIndexPath(代表端)
  • setSelected(再次)(有趣的是,此调用未清除背景色。该super方法内部发生了什么奇怪现象?)
  • 布局 subview (再次)

  • 所以你的选择是
  • 覆盖-(void)setSelected:(BOOL)选定的动画:(BOOL)动画; 而不调用 [super setSelected:selected animation:animated] 。这将为您提供最技术上正确的实现,因为a)代码被包装在UITableViewCell子类内,并且b)因为仅在需要时才调用(需要时调用两次,但是有办法解决)。缺点是您必须重新实现setSelected的所有必需功能(与不必要的颜色清除功能相对)。现在,不要问我如何正确重写setSelected。您的猜想现在和我的一样好(请耐心等待,一旦找到答案,我将编辑此答案)。
  • didSelectRowAtIndexPath 中重新声明背景颜色。这不是很好,因为它会将应作为实例代码的内容放在实例之外。它的好处是,仅在需要时才调用它,而不是...
  • 重新设置布局中的背景颜色 subview 。这根本不好,因为layoutSubviews的调用时间像百万次!每当桌子刷新,每次滚动,祖母每次烫发时都被称为……认真地说,是一百万次。这意味着有很多不必要的后台重新声明和大量额外的处理开销。从好的方面来说,它会将代码放在UITableViewCell子类中,这很不错。

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

    //TODO:给出有关如何覆盖setSelected(敬请期待)的详细说明

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

    10-09 16:30