複数行のUILabelを内容に合わせて自動縮小




 UILabelは文字列を表示する部品だが、固定した内容を表示する時はもちろん、状況に応じて内容を変更することもできる。この部品にはInterface Builderで見るとFont指定欄下に Autoshrink という属性(プロパティとしては adjustsFontSizeToFitWidth )があって、ここにチェックを入れていると文字列が長くてはみ出てしまうときは、自動でフォントサイズを小さくして全体が収まるようにしてくれる。(際限なく小さくすると読めなくなってしまうため、 MinimumSize という属性で最小サイズを指定できる。)もちろんチェックを外せば、はみ出る場合に例えば末尾が「…」という風に省略される。

 ところが、公式リファレンスにも記載されている通り、この Autoshrink という属性は Lines 属性が 1 の時しか有効にならないという制限がある。そうは言っても長い文字列の時は折り返して見やすく表示したいし、行数も分からないけど表示枠だけは決まっているというケースもあるはずだ。そんな時、自動でフォントサイズを小さくして決められた枠内に収まるような機能があれば嬉しい。

 例えば、Interface Builder上でUILabel部品を貼り付けて、labelという名前でOutletを作成したとする。まずは。Size Inspector を開いてサイズを決める。次に Attributes Inspector を開き、フォントとフォントサイズを決めてしまおう。そして今回は Autoshrink のチェックを外しておく。そして行数は動的に変わって欲しいので Lines =0 としておく。(こうすると自動で行数を増減してくれる。)そして次のようなコードを書いて、本来のサイズに収まるまでフォントサイズを小さくしていけば良い。

1
2
3
4
5
6
7
8
9
float orgHeight = self.label.frame.size.height;    // ラベルの高さの初期値を保持しておく
self.label.text = @"...";                          // 充分に長い文字列
[self.label sizeToFit];                            // 内容に合わせてラベルの大きさ(高さ)を変更
// 本来の高さになるまでフォントを小さくしていく
while (orgHeight < self.label.frame.size.height)
{
    self.label.font = [UIFont fontWithName:self.label.font.fontName size:self.label.font.pointSize - 0.1f];
    [self.label sizeToFit];
}

関連記事

Leave a Reply

アーカイブ