子类化视图

时间:2017-11-27 11:04:31

标签: swift oop view subclass

我想将UIView子类化为支持渐变(border / fill)。我有@IBInspectable变量的子类,所以我能够在IB中设置这种行为。

我还需要使用相同的方法对UIButton进行子类化。有没有办法在不将所有方法和实例变量复制到UIButton的子类的情况下做到这一点?

1 个答案:

答案 0 :(得分:1)

Swift中不允许多类继承(只有多个协议继承),因此你想要实现的不是直接的。

然而,可能的解决方法之一是将extension用于UIView。如果UIView(本身)和UIButton都是UIView的变体,则以下代码将适用于它们。

角半径示例:

extension UIView {
    @IBInspectable var cornerRadius: CGFloat {
        get {
            return layer.cornerRadius
        }
        set {
            layer.cornerRadius = newValue
            layer.masksToBounds = newValue > 0
        }
    }
}

现在,即使是非子类UIButton也将获取此属性,该属性将反映在Interface Builder中。

您可以尝试使用扩展功能来实现统一的IBInspectables。然而,您将不可避免地遇到的一个障碍是,您无法在扩展程序中获得任何存储空间。但在某些情况下,这可以作为一种解决方案。

P.S。其他几个使用示例(添加到UIView扩展名):

@IBInspectable var borderColor: UIColor? {
    get { return layer.borderColor.map(UIColor.init) }
    set { layer.borderColor = newValue?.cgColor }
}
@IBInspectable var borderWidth: CGFloat {
    get { return layer.borderWidth }
    set { layer.borderWidth = newValue }
}