将 IBInspectable 应用于 iOS 中的所有视图类型
Apply IBInspectable to all view types in iOS
我正在尝试将 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
}
}
在故事板中使用 BaseView
子类的所有 UIView
工作正常,但我如何将它用于按钮、文本字段、图像视图等?
可能正在使用协议或扩展来避免将此代码重复到所有其他类型的视图...
是UIView
的子类。要使用这些 class,您必须创建 UIImage
、UIButton
等
的子类
所以像这样创建每个组件的子classes
class ButtonSubClass: UIButton {}// for button subclass
class ImageSubClass: UIImage {}// for image subclass
您应该使用扩展而不是子类,并直接访问层 属性:
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
实现为可设置的 属性,但您可以为此设置一个只读的 属性。
我正在尝试将 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
}
}
在故事板中使用 BaseView
子类的所有 UIView
工作正常,但我如何将它用于按钮、文本字段、图像视图等?
可能正在使用协议或扩展来避免将此代码重复到所有其他类型的视图...
是UIView
的子类。要使用这些 class,您必须创建 UIImage
、UIButton
等
所以像这样创建每个组件的子classes
class ButtonSubClass: UIButton {}// for button subclass
class ImageSubClass: UIImage {}// for image subclass
您应该使用扩展而不是子类,并直接访问层 属性:
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
实现为可设置的 属性,但您可以为此设置一个只读的 属性。