1

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

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

4

2 回答 2

2

您应该使用扩展而不是子类,并直接访问 layer 属性:

extension UIView
{
    @IBInspectable var cornerRadius: CGFloat {
        get {
            return layer.cornerRadius;
        }
        set(value) {
            layer.cornerRadius = value;
        }
    }

    var rounded: Bool {
        return layer.cornerRadius > 0.0;
    }
}

注意:由于您没有实施drawRectusing@IBDesignable是不必要的。您不能rounded以这种方式实现为可设置属性,但您可以为此设置只读属性。

于 2018-01-10T05:46:43.463 回答
0

它是 的子类UIView。要使用这些类,您必须创建子类UIImageUIButton

所以像这样创建每个组件的子类

class ButtonSubClass: UIButton {}// for button subclass

class ImageSubClass: UIImage {}// for image subclass
于 2018-01-10T05:42:25.073 回答