2013年8月4日日曜日

UILabel : テキストの内容によりラベルの大きさを変える

テキストの内容やフォントの違いによる文字列の表示領域のサイズを取得するには、NSStringの
sizeWithFont:constrainedToSize:lineBreakMode:
を使用する。
複数行のUILabelでテキストの内容に合わせて高さを調整したい場合、これでサイズを取得してUILabelの大きさを設定する。
// --- テキストの内容によりラベルの大きさを変える ---
// 表示最大サイズ
CGSize bounds = CGSizeMake(label.frame.size.width, 200);
// フォント
UIFont *font = label.font;
// 表示モード
UILineBreakMode mode = label.lineBreakMode;
// 文字列全体のサイズを取得
CGSize size = [label.text sizeWithFont:font constrainedToSize:bounds lineBreakMode:mode];
NSLog(@"size: %@", NSStringFromCGSize(size));

// ラベルのサイズを変更
label.frame = CGRectMake(label.frame.origin.x,
                         label.frame.origin.y,
                         size.width, size.height);

iOS7ではNSStringの sizeWithFont:constrainedToSize:, sizeWithFont:constrainedToSize:lineBreakMode: がDeprecatedになり、かわりにboundingRectWithSize:options:attributes:context: を使用するようになった。
それと、取得したsizeをceilfなどで整数値に切り上げないとうまくいかない。

(下のような感じになる。lineBreakModeが考慮されていないけど。)

// --- テキストの内容によりラベルの大きさを変える ---
// 表示最大サイズ
CGSize bounds = CGSizeMake(label.frame.size.width, 200);
// フォント
UIFont *font = label.font;
// 表示モード
UILineBreakMode mode = label.lineBreakMode;
// 文字列全体のサイズを取得
CGSize size;
if ([NSString instancesRespondToSelector:@selector(boundingRectWithSize:options:attributes:context:)]) {
    CGRect rect
    = [label.text boundingRectWithSize:bounds
                               options:NSStringDrawingUsesLineFragmentOrigin
                            attributes:@{NSFontAttributeName:font}
                               context:nil];
    size = rect.size;
}
else {
    CGSize size = [label.text sizeWithFont:font
                         constrainedToSize:bounds
                             lineBreakMode:mode];
}
size.width  = ceilf(size.width);
size.height = ceilf(size.height);
NSLog(@"size: %@", NSStringFromCGSize(size));

// ラベルのサイズを変更
label.frame = CGRectMake(label.frame.origin.x,
                         label.frame.origin.y,
                         size.width, size.height);

0 件のコメント:

コメントを投稿