我正在尝试将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
    }
}

使用情节提要中的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实现为可设置的属性,但是可以为此设置一个只读属性。

10-08 12:13