将 IBInspectable 应用于 iOS 中的所有视图类型

Apply IBInspectable to all view types in iOS

我正在尝试将 IBInspectable 应用于所有类型的视图,例如 UIViewUIButtonUITextFieldUIImageView
这是我所做的:

@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,您必须创建 UIImageUIButton

的子类

所以像这样创建每个组件的子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 实现为可设置的 属性,但您可以为此设置一个只读的 属性。