Swift UIButton タイトル文字の余白設定 継承について

UIButton のタイトル文字にパディングを設定する。

実現したいことはこれ。

これがStoryBoad上の表示

f:id:happy_teeth_ago:20181001173640p:plain:w300

これが、iPhone上の表示。ビルド時には、このように表示したい。

f:id:happy_teeth_ago:20181001172518p:plain:w300

参考にしたサイトには下記のように書いてある。

ボタンのサイズに併せて、titleLabelをフィットさせたい時は以下の1行で済みます。

self.myOutlet_answerBtn1.titleLabel.adjustsFontSizeToFitWidth = YES;

ボタンのインスタンスに対して、プロパティを設定している。 しかし、すべてのボタンに対して設定するのは面倒である。

それでUIButtonを継承したクラスを作成し、それを利用することにする。

class MsTitledButton: UIButton {
    /// contentRect に関する Title label の 上下 margin
   //これはただの上方向への移動  
   private static let MARGIN_VRT: CGFloat = 15.0
    
    override func titleRect(forContentRect contentRect: CGRect) -> CGRect {
    
        let tr = super.titleRect(forContentRect: contentRect)
        return CGRect(x:tr.origin.x,
                      y:contentRect.minY + MsTitledButton.MARGIN_VRT,
                      width:tr.width ,height:tr.height)
    }
    //ここがタイトル文字のパディング。まずタイトルの幅を決めて上げる。それに対してadjustsFontSizeToFitWidthをセット
    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
        // 英文がはみ出ないように、サイズに合わせてフィットさせる
        titleEdgeInsets = UIEdgeInsets(top: 0.0, left: 10.0, bottom: 0.0, right: 15.0)
        titleLabel!.adjustsFontSizeToFitWidth = true
    }

ここでのポイントは、UIButton のクラスをオーバーライドするときに、initメソッドを呼ぶこと。 そうすることにより、UIButtonのプロパティ-にアクセスできる。

このメソッドは、アップルが用意しているもので、変更不可。いつも定形。よって覚えるしか無い。

required init?(coder aDecoder: NSCoder) {

super.init(coder: aDecoder)

こうすることにより、StoryBoardで接続するときに、クラスを選択するだけで自動でセットされる。

IBOutlet接続時に、UIButton を継承したクラスは表示される。

f:id:happy_teeth_ago:20181001173524p:plain

これが継承である。

説明するより、実際に目的をもって使ってみて、なれるほうが大切だと思う。