为啥设置 backgroundColor 对我的自定义 UIView 没有明显影响?

Posted

技术标签:

【中文标题】为啥设置 backgroundColor 对我的自定义 UIView 没有明显影响?【英文标题】:Why doesn't setting backgroundColor have a visible effect on my custom UIView?为什么设置 backgroundColor 对我的自定义 UIView 没有明显影响? 【发布时间】:2018-06-24 09:40:58 【问题描述】:

当我设置 UIView 的 Xib 实例化子类的 backgroundColor 属性时,视图的背景颜色不会改变,而是保持 Xib 中设置的颜色。

重现问题

我创建了一个UIView 的子类,我们称之为MyView,以及我从中实例化它的Xib。使用 Interface Builder,我已将 Xib 中视图的背景颜色设置为蓝色。

我添加了一个MyView 的实例作为我的应用程序主视图的子视图。正如预期的那样,它显示为蓝色。

然后,我添加了一个插座 myView,引用了 MyView 的实例,以及一个按钮,其操作尝试更改视图的背景颜色,如下所示:

@IBOutlet weak var debugView: MyView!

@IBAction func debug(_ sender: Any) 
    myView.backgroundColor = UIColor.green

我预计myView 的背景颜色会变为绿色;相反,它像以前一样保持蓝色。

观察

奇怪的是,如果我在调试器中检查视图的背景颜色,似乎该属性已按预期设置为绿色,即使更改不可见:

(lldb) p debugView.backgroundColor == UIColor.blue
(Bool) $R1 = false
(lldb) p debugView.backgroundColor == UIColor.green
(Bool) $R2 = true

我也尝试过使用setNeedsDisplay() 强制视图重绘,但没有效果。

为什么我的自定义视图的外观没有反映其backgroundColor 属性?

【问题讨论】:

Debug View Hierarchy 可能有助于查看它是否位于任何其他视图后面。 @Kamran 就是这样!我在反序列化时遵循将 xib 的“contentView”嵌套​​在子类视图本身中的模式,因此我需要设置 contentView 的属性,而不是视图的属性本身!我现在觉得有点傻 @Kamran 如果您愿意以某种形式将其作为答案,我很乐意将其标记为正确。 【参考方案1】:

您可能将 nib 中的视图作为子视图添加到 swift 文件中的自定义视图,这就是更改背景颜色的原因,您将看不到更改。您需要更改调试视图的子视图的背景颜色才能看到颜色变化。 例如:-

self.debugView.subviews.first?.backgroundColor = 
    self.debugView.subviews.first?.backgroundColor == UIColor.blue
        ? UIColor.black : UIColor.blue

【讨论】:

以上是关于为啥设置 backgroundColor 对我的自定义 UIView 没有明显影响?的主要内容,如果未能解决你的问题,请参考以下文章

使用epplus c#设置Excel工作表单元格的自定义BackgroundColor

为啥在 fullcalendar 事件上设置 backgroundColor 只是更改点颜色而不是设置背景颜色?

为啥 CMake 没有与我的自定义库(add_library/set_property)链接?

为啥我的自定义单元格仅在用户移开手指时突出显示?

UIImageView backgroundColor colorWithPatternImage 不显示

如何阻止 Go gorm 在 Postgres 中对我的自引用外键强制非空约束