UILabel にインデントを設定する方法

2015.04.15

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

UILabel の Indent

簡単そうでちょっと面倒な UILabel の字下げ。 今回は以下の 2 パターンの実現方法をご紹介します。

  1. UILabel のdrawTextInRectをオーバーライドする方法
  2. NSMutableParagraphStyleを利用する方法

オリジナルの見た目

IndentLabel1

Indent 設定後の見た目

IndentLabel2

1. UILabel の drawTextInRect をオーバーライドする方法

この方法では UILabel のサブクラスを作り、そのdrawTextInRectメソッドをオーバーライドします。

サンプルコード

class IndentLabel: UILabel {
override func drawTextInRect(rect: CGRect) {
let insets = UIEdgeInsets(top: 0, left: 20, bottom: 0, right: 20)
super.drawTextInRect(UIEdgeInsetsInsetRect(rect, insets))
}
}

テキストを描画する矩形のInsetsを指定することによってインデントを行っています。

サブクラス化するのがちょっと手間ですが、割とラク。

2. NSMutableParagraphStyle を利用する方法

こちらでは明示的にインデントする距離を指定します。

サンプルコード

let paragraphStyle = NSMutableParagraphStyle()
paragraphStyle.firstLineHeadIndent = 20
paragraphStyle.headIndent = 20
paragraphStyle.tailIndent = -20

let attributedString = NSAttributedString(string: text /* long text */, attributes: [NSParagraphStyleAttributeName: paragraphStyle])
self.label.attributedText = attributedString

NSMutableParagraphStyle を元に NSAttributedString を生成し、UILabel の attributedText として設定します。

headIndentfirstLineHeadIndentを共に設定しなければいけないのが面倒なところ。 また、lineBreakModeもデフォルトで ByWordWrapping となっており、UILabel のデフォルトである ByTruncatingTail ではないというのも気になる。 ただ、Indent だけではなく、lineSpacingparagraphSpacingといったプロパティが設定できるのは魅力的。

まとめ

個人的な感想としては、単純な Indent のみの設定を行いたいのであれば前者を、その他の複雑な設定も同時に行いたいのであれば後者を使うのがよいと感じました。