具有IBInspectable颜色属性的子类 - 无法覆盖

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了具有IBInspectable颜色属性的子类 - 无法覆盖相关的知识,希望对你有一定的参考价值。

我有一个具有IBInspectable颜色属性的自定义UIView类:

class MyParent: UIView {
    // use CGColor for setting background (a gradient), and IBInspectable UIColor to choose color in Interface Builder
    var color1: CGColor = UIColor(red: 100.0/255.0, green: 130.0/255.0, blue: 230.0/255.0, alpha: 1.0).CGColor
    var color2: CGColort = UIColor(red: 200.0/255.0, green: 30.0/255.0, blue: 30.0/255.0, alpha: 1.0).CGColor
    @IBInspectable var UIcolor1: UIColor = UIColor(red: 100.0/255.0, green: 130.0/255.0, blue: 230.0/255.0, alpha: 1.0) {
        didSet {
            color1 = UIcolor1.cgColor
        }
    }

    // INIT: Set gradient with color1/2 for the background of MyParent view
    override init(frame: CGRect) {
        super.init(frame: frame);
        var gradient = CAGradientLayer()
        gradient.frame = bounds
        gradient.colors = [color1, color2]
        layer.insertSublayer(gradient, at: 0)
    }
}

澄清更新:以这种方式完成,以便能够在Interface Builder中选择颜色(仅适用于UIColor),但随后视图的背景是渐变,则需要将其转换为CGColor。因此didSet完成工作,在IB中选择UIColor后,背景分别发生变化。

现在我想有另一个自定义UIView,它是MyParent的子类,我想设置另一个默认UIcolor1,但是我收到一个错误:

class MySubclass: MyParent {
    // override UIcolor1
    override var UIcolor1: UIColor = UIColor.blue

    // ...
}

以下错误:

Cannot override the stored property 'UIcolor1'

我怎样才能使这个工作?

答案

如果你不想在init中设置你的颜色,我认为你可以做到最好

class MySubclass: MyParent {
// override UIcolor1
  override var UIcolor1: UIColor {
      get {
          return .blue
      }
      set {
          color1 = newValue.cgColor
      }
   }
// ...
}

代码编辑后

我认为没有必要使用子类化视图。这是工作代码

@IBDesignable
class MyParent: UIView {
    // use CGColor for setting background, and IBInspectable UIColor to choose color in Interface Builder
    var color1: UIColor = UIColor.blue {
        didSet {
            gradientLayer.colors = [color1.cgColor, color2]
        }
    }

   var color2: CGColor = UIColor.green.cgColor

   @IBInspectable var inspectableColor1: UIColor {
       get {
           return color1
       }
       set {
           color1 = newValue
       }
   }

   private var gradientLayer = CAGradientLayer()
   // INIT: Set color1 for the background of MyParent view
   // ...
   override init(frame: CGRect) {
      super.init(frame: frame)
      setupLayer()
   }

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

  func setupLayer() {
      gradientLayer.frame = bounds
      gradientLayer.colors = [color1.cgColor, color2]
      layer.insertSublayer(gradientLayer, at: 0)
  }
}

以上是关于具有IBInspectable颜色属性的子类 - 无法覆盖的主要内容,如果未能解决你的问题,请参考以下文章

为啥标记为@IBInspectable 的属性不起作用?

IBDesignable UIButton 子类

如何使用 @IBDesignable 和 @IBInspectable 制作 uitextfield 的自定义子类并在那里我可以从左侧设置占位符填充

配置 @IBInspectable 属性检查器控件

IBInspectable 属性值未在 xib 中更新

UIButton 子类中的 imageview.transform 奇怪的行为