我正在尝试将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
工作正常,但如何将其用于按钮,文本字段,图像视图等?
可能正在使用协议或扩展程序,以避免将此代码重复到所有其他类型的视图...
答案 0 :(得分:2)
您应该使用扩展名而不是子类,并直接访问图层属性:
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
实现为可设置属性,但您可以拥有该属性的只读属性。
答案 1 :(得分:0)
它是UIView
的子类。要使用这些类,您必须创建UIImage
,UIButton
等子类。
因此,像这样创建每个组件的子类
class ButtonSubClass: UIButton {}// for button subclass
class ImageSubClass: UIImage {}// for image subclass