我很好奇为什么这不设置backgroundColor
to red?
@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()
}
}
这就是结果。
这就是我期望它的样子。
在 Interface builder(IB) 中渲染时,自定义 UI 元素的 IB 中设置的属性将在调用后加载init
。您的设置代码backgroundColor
in init
正在接到电话。但在那之后,它再次设置了backgroundColor
的价值backgroundColor
in IB.
我找不到这方面的苹果文档。我这样说是基于以下分析。我对你的代码进行了一些修改以进行调试。
@IBDesignable class CustomLabel: UIView {
let view = UIView()
override var backgroundColor: UIColor? {
didSet {
print("here: "); // break point 1
}
}
func setup() {
self.backgroundColor = UIColor.redColor() // break point 2
view.backgroundColor = UIColor.greenColor()
view.frame = CGRect(x: 0, y: 0, width: 50, height: 50)
addSubview(view)
}
override init(frame: CGRect) {
super.init(frame: frame) // break point 3
setup()
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder) // break point 4
setup()
}
}
现在,在所有方法中放置断点。然后,选择对象CustomLabel
在 Interface Builder 中,然后选择编辑器 ➔ 调试选定视图。
您可以看到方法调用的顺序。这仅显示了界面生成器中的渲染顺序,而不是它在运行时可能遵循的顺序。
也许您知道这一点,但为了清楚起见,您可以使用以下内容在 IB 中反映这一点。
override func prepareForInterfaceBuilder() {
super.prepareForInterfaceBuilder()
backgroundColor = UIColor.grayColor()
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)