@IBDesignable UIView 不在故事板中调用 init

@IBDesignable UIView not calling init within storyboard

我有一个 UIView@IBDesignable

@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 中将其 class 分配给 MyView 时,UIView 仍然有一个默认的背景颜色。为什么它的背景色在 Storyboard 中不是 UIColor.blue?而且,请问我怎样才能做到这一点?

感谢您的帮助。

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

@IBDesignable
class MyView: UIView {

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

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

我看不出用你的自定义 属性 设置背景颜色有什么用,因为 UIView 有默认的 属性 来设置背景颜色。

希望对您有所帮助。

从情节提要中初始化此视图的初始化程序将在运行时调用,为了在编译时更新情节提要中的视图,您应该尝试包含 prepareForInterfaceBuilder,它会在编译时更新情节提要 xib 文件。

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

  1. @IBDesignable标签标记class
  2. UIView 属性 标记为 @IBInspectable,然后您将能够使用 StoryBoard 更改此 属性 的值]
  3. 设置那个属性的willSet中的配置代码是属性取值前的变化观察者,或者[=49=后的didSet ] 收到值。
  4. prepareForInterfaceBuilder() 中进行额外的设置,它覆盖了其超级 class 类型的 UIView

简单易行!

您的代码应如下所示:

Swift 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 初始值为红色,您可以从 storyBoard 更改它;)

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. Select InterfaceBuilder 中的 UIView。
  3. Identity InspectorselectCustom Class -> Class to "BoxView"
  4. Attributes Inspector 中设置 borderColorborderWidthborderRadius