IBInspectable / IBDesignable的Swift多继承解决方案?

时间:2017-01-07 16:56:59

标签: ios swift storyboard ibdesignable ibinspectable

我一直在玩IBInspectable / IBDesignable,如本文所述:http://nshipster.com/ibinspectable-ibdesignable/

它显示了如何进行扩展以在storyboard中添加额外的编辑选项。但问题是您无法在预览中看到这些更改。为此,您需要子类化,使用IBDesignable并执行didset{}内容。

这个问题是你需要创建每个stock UIView子类的子类。所以是UILabelUITextField的子类,依此类推。每次你必须复制/粘贴常规的UIView内容,如边框和角半径。

我不相信Swift支持多重继承,这会使这更容易。

假设您IBDesignable的{​​{1}}子类名为UIView。有没有办法制作,例如IBViewUILabel的子类,而不是IBView

最后,我在寻找是否有办法让UIView减少繁琐。

1 个答案:

答案 0 :(得分:2)

和您一样,我正在努力寻找更好的解决方案来使用IBDesignable。

我做了什么来避免重复相同的代码:

  1. 我扩展了UIView以插入我想要的所有@IBInspectables(如corder radius,border width ...)。
  2. 我创建了我的@IBDesignables,它只从UIView,UIButton(或我想要的UIView的任何子类)继承,以便在Interface Builder上呈现。
  3. 检查此代码:

    extension UIView {
    
        @IBInspectable var cornerRadius: CGFloat {
            get {
                return layer.cornerRadius
            }
            set {
                layer.cornerRadius = newValue
                layer.masksToBounds = newValue > 0
            }
        }
    
        @IBInspectable var borderColor: UIColor? {
            get {
                return UIColor(cgColor: layer.borderColor ?? UIColor.clear.cgColor)
            }
    
            set {
                layer.borderColor = newValue?.cgColor
            }
        }
    
        @IBInspectable var borderWidth: Double {
            get {
                return Double(layer.borderWidth)
            }
    
            set {
                layer.borderWidth = CGFloat(newValue)
            }
        }
    }
    
    @IBDesignable
    class BorderView: UIView { }
    
    @IBDesignable
    class BorderButton: UIButton { }
    

    我希望它可以帮到你!