我很好奇为什么backgroundColor
不设置为红色?
@IBDesignable class CustomLabel: UIView {
let view = UIView()
func setup() {
backgroundColor = UIColor.red
view.backgroundColor = UIColor.green
view.frame = CGRect(x: 0, y: 0, width: 50, height: 50)
addSubview(view)
}
override init(frame: CGRect) {
super.init(frame: frame)
setup()
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
setup()
}
}
这就是结果。
这就是我所期望的样子。
3条答案
按热度按时间p4rjhz4m1#
在界面生成器(IB)中呈现时,在调用
init
后,将加载在IB中设置的自定义UI元素的属性。将调用用于在init
中设置backgroundColor
的代码。但在此之后,它将再次在IB中为backgroundColor
的值设置backgroundColor
。我找不到苹果的文档。我是基于下面的分析说这句话的。我修改了你的代码一点调试。
现在,在所有方法中放置断点,然后在Interface Builder中选择
CustomLabel
对象,并选择Editor Debug Selected Views。你可以看到方法调用的顺序,这只是显示了在界面构建器中呈现的顺序,而不是它在运行时可能遵循的顺序。
您可能知道这一点,但为了清楚起见,您可以使用以下内容在IB中反映这一点。
blmhpbnm2#
init(frame:)和init?(coder:)的逻辑在InterfaceBuilder渲染模式下导致两种不同的渲染,因为用于渲染IBDesignable类的IBDesignablesAgent-iOS调用init(frame:),然后使用“用户定义的运行时属性”默认/自定义值来配置自定义视图。因此,init(frame:)中设置的backgroundColor将根据Interface builder中设置的背景颜色的默认/自定义值进行更改。如果应用程序在设备或模拟器上运行时进行运行时渲染,则使用init?(coder:)方法,并在应用故事板的默认/自定义值后应用“setup()”逻辑。如果从代码创建自定义视图,则使用init(frame:)方法,但故事板的“用户定义的运行时属性”不存在解码,因为该属性不存在。
pxyaymoc3#
界面生成器和运行时中的渲染行为略有不同。IBDesignablesAgent-iOS用于在界面生成器中渲染IBDesignable类,它调用
init(frame:)
,* 之后 * 它使用“用户定义的运行时属性”默认/自定义值来配置自定义视图。这意味着init(frame:)
中设置的背景颜色将更改为默认/在界面生成器中设置的背景色的自定义值,后者是您在界面生成器中看到的渲染。这与运行时(应用在设备或模拟器上运行时)发生的渲染逻辑不同。在这里,界面生成器中设置的默认/自定义值在调用
init?(coder:)
方法 * 之后 * 应用。这意味着init?(coder:)
中设置的背景色是您在设备上看到的渲染。(感谢@Blazej)