我想将UIView子类化为支持渐变(border / fill)。我有@IBInspectable变量的子类,所以我能够在IB中设置这种行为。
我还需要使用相同的方法对UIButton进行子类化。有没有办法在不将所有方法和实例变量复制到UIButton的子类的情况下做到这一点?
答案 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 }
}