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

时间:2018-01-10 05:39:25

标签: ios storyboard ibdesignable ibinspectable

我正在尝试将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工作正常,但如何将其用于按钮,文本字段,图像视图等?

可能正在使用协议或扩展程序,以避免将此代码重复到所有其他类型的视图...

2 个答案:

答案 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的子类。要使用这些类,您必须创建UIImageUIButton等子类。

因此,像这样创建每个组件的子类

class ButtonSubClass: UIButton {}// for button subclass

class ImageSubClass: UIImage {}// for image subclass