Swift UIButton タイトル文字の余白設定 継承について
UIButton のタイトル文字にパディングを設定する。
実現したいことはこれ。
これがStoryBoad上の表示
これが、iPhone上の表示。ビルド時には、このように表示したい。
参考にしたサイトには下記のように書いてある。
ボタンのサイズに併せて、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 を継承したクラスは表示される。