@IBDesignable视图不会在Interface Builder中绘制背景颜色

Mor*_*lde 6 interface-builder ios swift ibdesignable

我很好奇为什么不设置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()
  }
}
Run Code Online (Sandbox Code Playgroud)

这是结果.

在此输入图像描述

这就是我期望的样子.

在此输入图像描述

san*_*san 11

在"界面"构建器(IB)中进行渲染时,在调用后加载在自定义UI元素的IB中设置的属性init.您的设置代码backgroundColorinit获取调用.但在那之后,它再次设定了IB backgroundColor的价值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()
    }
}
Run Code Online (Sandbox Code Playgroud)

现在,将断点放在所有方法中.然后,CustomLabel在Interface Builder中选择对象,然后选择编辑器➔调试所选视图.

您可以看到方法调用的顺序.这只显示了界面构建器中的渲染顺序,而不是它在运行时可能遵循的顺序.

您可能知道这一点,但为了清楚起见,您可以使用以下内容在IB中反映出来.

override func prepareForInterfaceBuilder() {
    super.prepareForInterfaceBuilder()
    backgroundColor = UIColor.grayColor()

}
Run Code Online (Sandbox Code Playgroud)