@IBDesignable视图不会在Interface Builder中绘制背景颜色
我很好奇为什么不将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() } }
结果就是这样。
这就是我期望的样子。
在“界面”构建器(IB)中进行渲染时,在调用init
之后会加载在自定义UI元素的IB中设置的属性。 您在init
设置backgroundColor
代码正在调用。 但之后,它再次将backgroundColor
颜色设置为IB中backgroundColor
的值。
我找不到Apple的文档。 我基于以下分析说这个。 我修改了一些代码用于调试。
@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() } }
现在,将断点放在所有方法中。 然后,在Interface Builder中选择CustomLabel
的对象,并选择编辑器➔调试所选视图。
您可以看到方法调用的顺序。 这只显示了界面构建器中的渲染顺序,而不是它在运行时可能遵循的顺序。
您可能知道这一点,但为了清楚起见,您可以使用以下内容在IB中反映出来。
override func prepareForInterfaceBuilder() { super.prepareForInterfaceBuilder() backgroundColor = UIColor.grayColor() }