ios @IBDesignable视图不会在界面生成器中绘制背景色

7vux5j2d  于 2022-12-24  发布在  iOS
关注(0)|答案(3)|浏览(164)

我很好奇为什么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()
  }
}

这就是结果。

这就是我所期望的样子。

p4rjhz4m

p4rjhz4m1#

在界面生成器(IB)中呈现时,在调用init后,将加载在IB中设置的自定义UI元素的属性。将调用用于在init中设置backgroundColor的代码。但在此之后,它将再次在IB中为backgroundColor的值设置backgroundColor
我找不到苹果的文档。我是基于下面的分析说这句话的。我修改了你的代码一点调试。

@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对象,并选择Editor Debug Selected Views。
你可以看到方法调用的顺序,这只是显示了在界面构建器中呈现的顺序,而不是它在运行时可能遵循的顺序。
您可能知道这一点,但为了清楚起见,您可以使用以下内容在IB中反映这一点。

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

}
blmhpbnm

blmhpbnm2#

init(frame:)和init?(coder:)的逻辑在InterfaceBuilder渲染模式下导致两种不同的渲染,因为用于渲染IBDesignable类的IBDesignablesAgent-iOS调用init(frame:),然后使用“用户定义的运行时属性”默认/自定义值来配置自定义视图。因此,init(frame:)中设置的backgroundColor将根据Interface builder中设置的背景颜色的默认/自定义值进行更改。如果应用程序在设备或模拟器上运行时进行运行时渲染,则使用init?(coder:)方法,并在应用故事板的默认/自定义值后应用“setup()”逻辑。如果从代码创建自定义视图,则使用init(frame:)方法,但故事板的“用户定义的运行时属性”不存在解码,因为该属性不存在。

pxyaymoc

pxyaymoc3#

界面生成器和运行时中的渲染行为略有不同。IBDesignablesAgent-iOS用于在界面生成器中渲染IBDesignable类,它调用init(frame:),* 之后 * 它使用“用户定义的运行时属性”默认/自定义值来配置自定义视图。这意味着init(frame:)中设置的背景颜色将更改为默认/在界面生成器中设置的背景色的自定义值,后者是您在界面生成器中看到的渲染。
这与运行时(应用在设备或模拟器上运行时)发生的渲染逻辑不同。在这里,界面生成器中设置的默认/自定义值在调用init?(coder:)方法 * 之后 * 应用。这意味着init?(coder:)中设置的背景色是您在设备上看到的渲染。
(感谢@Blazej)

相关问题