我正在尝试将IBInspectable
应用于所有类型的视图,例如UIView
,UIButton
,UITextField
,UIImageView
等。
这是我所做的:
@IBDesignable
class BaseView: UIView
{
override func layoutSubviews() {
super.layoutSubviews()
updateCornerRadius()
}
@IBInspectable var rounded: Bool = false {
didSet {
updateCornerRadius()
}
}
@IBInspectable var cornerRadius: CGFloat = 4 {
didSet {
updateCornerRadius()
}
}
private func updateCornerRadius() {
layer.cornerRadius = rounded ? cornerRadius : 0
}
}
使用情节提要中的
UIView
子类,所有BaseView
都可以正常工作,但是如何将其用于按钮,文本字段,图像视图等?可能正在使用协议或扩展名,以避免对所有其他类型的视图重复此代码...
最佳答案
您应该使用扩展而不是子类,并直接访问layer属性:
extension UIView
{
@IBInspectable var cornerRadius: CGFloat {
get {
return layer.cornerRadius;
}
set(value) {
layer.cornerRadius = value;
}
}
var rounded: Bool {
return layer.cornerRadius > 0.0;
}
}
注意:由于您不需要使用
drawRect
来实现@IBDesignable
,因此是不必要的。您不能通过这种方式将rounded
实现为可设置的属性,但是可以为此设置一个只读属性。