Edited at

【iOS】UILabelにPaddingをつける

More than 1 year has passed since last update.


Swift3で書き直しました

【iOS】UILabelにPaddingをつける(Swift3対応) - Qiita

上記の記事でSwift3用に書き直したソースコードを書いたので、そちらをご参考ください。


過去記事

UILabelに日本語フォントを設定している状態で英字を表示すると g とか q とか p など下に伸びる文字が切れて表示されることがあったのでそれの対応として UILabelPaddingを設定しました。


PaddingLabel.swift

class PaddingLabel: UILabel {

// paddingの値
let padding = UIEdgeInsets(top: 4, left: 4, bottom: 4, right: 4)

override func drawTextInRect(rect: CGRect) {
let newRect = UIEdgeInsetsInsetRect(rect, padding)
super.drawTextInRect(newRect)
}

override func intrinsicContentSize() -> CGSize {
var intrinsicContentSize = super.intrinsicContentSize()
intrinsicContentSize.height += padding.top + padding.bottom
intrinsicContentSize.width += padding.left + padding.right
return intrinsicContentSize
}
}



ちょっと解説

overrideしているメソッドについて少しだけ解説してみます。


drawTextInRect(rect: CGRect)

これは文字列を描画するメソッドです。

引数として渡されるrect: CGRectが描画する位置は高さ、幅になります。

それをUIEdgeInsetsInsetRect(rect: CGRect, insets: UIEdgeInsets)で描画範囲を広げています。


intrinsicContentSize() -> CGSize

これはUILabelがもともと持っているサイズになります。

AutoLayoutではこれがとっても重要になってきます。

intrinsicContentSize()で適切なサイズを返さないとpaddingを設定してもそれが適用されず、表示されないというオチになります。


終わりに

今後使えるかと思ったのでメモがてらに書きました。