UIViewの角丸(Rounded Corners)みんなどうしてる?

Viewの角を丸くしたいことって結構ありますね。@IBDesignableと@IBInspectableを使うとマウス操作で調整できて便利なので、今までUIViewを拡張して使っていたのですが「そう言えばStoryboardで反映されてないなぁ」と気づきまして調べてみると、なんと、extensionの@IBDesignableは効かないそうです^^;;;重くなるからってことでしょうか。

extensionが無理となるとサブクラスなのですが、クラスを絞れないんですよね。角丸Viewだけを使うとかも考えましたが、結構いろんなパーツを丸くしたい時があります。

そこで万能な角丸クラスは諦めてUser Defined Runtime Attributesに直接書く方法で妥協することにしました。

角丸にしたい時はlayer.cornerRadiusをNumberで設定します。枠線の色を設定したい時はlayer.borderColorですが、CGColor型で設定できないのでUIColorで設定できるように最低限の拡張だけは施しておきます。

extension UIView {
    
    @objc var borderColor: UIColor? {
        get {
            return layer.borderColor.map(UIColor.init)
        }
        set {
            layer.borderColor = newValue?.cgColor
        }
    }
    
    @objc var shadowColor: UIColor? {
        get {
            return layer.shadowColor.map(UIColor.init)
        }
        set {
            layer.shadowColor = newValue?.cgColor
        }
    }
}

@IBInspectableはextensionでも効くので付けても構いません。これで、ある程度CALayerの値が変更できるようになりました。

このままではStoryboardで確認できないので、以下の@IBDesignable付きのサブクラスを指定します。これで値を変えてもリアルタイムに反映されますが、古いMacだと読み込みで少々待たされます。

@IBDesignable class IBDesignableView: UIView {}
@IBDesignable class IBDesignableImageView: UIImageView {}
@IBDesignable class IBDesignableTextField: UITextField {}
@IBDesignable class IBDesignableTextView: UITextView {}
@IBDesignable class IBDesignableButton: UIButton {}

それぞれクラスに@IBDesignableを付けただけなので、不要ならすぐ元に戻せます。

毎回ビルドしないと確認できないのは不便なので、この程度の手間なら我慢できそうです。