繁体   English   中英

@IBDesignable UIView 不在情节提要中调用 init

[英]@IBDesignable UIView not calling init within storyboard

我有一个@IBDesignableUIView

@IBDesignable
class MyView: UIView {

    override init(frame: CGRect) {
        super.init(frame: frame)
        sharedInit()
    }

    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
        sharedInit()
    }

    private func sharedInit(){
        translatesAutoresizingMaskIntoConstraints = false
        backgroundColor = .blue
    }

}

当我将这个UIView放在 Storyboard 中,并将它的类分配给Identity inspector 中的MyView时, UIView仍然具有默认背景颜色。 为什么它的背景颜色不是故事板中的UIColor.blue 而且,我怎样才能做到这一点,拜托?

谢谢你的帮助。

从故事板初始化此视图的初始化程序将在运行时调用,为了在编译时更新故事板中的视图,您应该尝试包含在编译时更新故事板 xib 文件的prepareForInterfaceBuilder

我建议你在创建 @IBDesignable 类时做多件事:

  1. 使用@IBDesignable标签标记类
  2. 使用@IBInspectable标记UIView属性,然后您将能够使用StoryBoard更改此属性的值
  3. 在该属性的willSet中设置配置代码,该属性在属性取值之前是变化的观察者,或在属性didSetdidSet
  4. prepareForInterfaceBuilder()进行额外的设置,它覆盖了它的超类UIView

简单易行!

您的代码应如下所示:

斯威夫特5:

import UIKit

@IBDesignable
class myView: UIView {

  @IBInspectable var storyBoardColor : UIColor = .red {         
    willSet(myVariableNameToCatch) {
      self.backgroundColor = myVariableNameToCatch
    }
   }

  fileprivate func sharedInit(){
    translatesAutoresizingMaskIntoConstraints = false
    backgroundColor = storyBoardColor
  }

  override func prepareForInterfaceBuilder() {
    super.prepareForInterfaceBuilder()
    sharedInit()
  }
}

myView 的 storyBoardColor 的初始值为 red,您可以从 storyBoard 更改它;)

在此处输入图片说明

使用标签@IBDesignable 创建视图后。 接下来是使用@IBInspectable 设置您的属性。

@IBDesignable
class MyView: UIView {

    @IBInspectable var myBackgroundColour: UIColor? = nil {
        willSet(v) {
            self.backgroundColor = v
        }
    }
   // YOUR EXISTING CODE HERE
}

现在,当您在Identity Inspector中将 MyView 设置为类名时。 您将能够在Attributes Inspector 中看到您的可检查属性。 您可以在那里设置颜色,它会立即反映到您的自定义视图中。

我认为使用自定义属性设置背景颜色没有任何用处,因为 UIView 具有设置背景颜色的默认属性。

希望能帮助到你。

Swift 4.2 测试和工作。 这是最干净的解决方案。

在 Xcode 中确保选中Editor -> Automatically refresh views

import UIKit

@IBDesignable
class BoxView: UIView {

    override func prepareForInterfaceBuilder() {
        super.prepareForInterfaceBuilder()
        layer.borderColor = borderColor?.cgColor
        layer.borderWidth = borderWidth
        layer.cornerRadius = cornerRadius
    }

    @IBInspectable var borderColor: UIColor? {
        didSet {
            layer.borderColor = borderColor?.cgColor
            setNeedsLayout()
        }
    }

    @IBInspectable var borderWidth: CGFloat = 0.0 {
        didSet {
            layer.borderWidth = borderWidth
            setNeedsLayout()
        }
    }

    @IBInspectable var cornerRadius: CGFloat = 0.0 {
        didSet {
            layer.cornerRadius = cornerRadius
            setNeedsLayout()
        }
    }
}
  1. 创建上面的 BoxView.swift 文件。
  2. 在 InterfaceBuilder 中选择一个 UIView。
  3. Identity Inspector选择Custom Class -> Class to "BoxView"
  4. Attributes Inspector设置borderColorborderWidthborderRadius

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM