pirosikick's diary

君のハートにunshift

UILabelのheightを動的に計算する

UILabelには文字を表示するのに使うクラスです。
UILableのlineBrreakModeプロパティではwidthを超えてしまう文字に対してどのように処理するかを設定します。

lineBreakModeプロパティ(UILineBreakMode)
UILineBreakMode 説明
UILineBreakModeWordWrap(デフォルト) 単語が切れたところで改行しすべてを表示する
UILineBreakModeCharacterWrap 文字の途中で改行しすべてを表示する
UILineBreakModeClip はみ出た部分は表示しない
UILineBreakModeHeadTruncation 文の頭を省略して横幅に合わせる。文の頭に「...」
UILineBreakModeTailTruncation 文の後ろを省略して横幅に合わせる 。文の後ろに「...」
UILineBreakModeMiddleTruncation 文の真ん中を省略して横幅に合わせる。文の後ろに「...」

lineBreakModeプロパティを適切に設定することで、表示する文字数が可変する場合でも適切に表示出来るような気がしますが、UILabelのheightプロパティは最初に設定した高さのままなので、 文を改行したくてもその分の高さが無ければすべての文をを表示できません。

高さを計算する方法

NSStringのメソッドに「- (CGSize)sizeWithFont:(UIFont *)font forWidth:(CGFloat)width lineBreakMode:(UILineBreakMode)lineBreakMode」というメソッドがあります。このメソッドは、表示するNSStringと表示横幅(CGFloat)と改行モード(UILineBreakMode)とフォント(UIFont)から必要な高さを計算するメソッドです。
ただ返り値がCGSizeなので、自分はheightだけ取り出すメソッドを作ってみました(無駄なような気もしますが。。てか動くの?)

-(CGFloat)heightOfLabel:(UILabel *)label
{
    CGFloat height = [[[label text] sizeWithFont:[label font] forWidth:[[[label frame] size] width] lineBreakMode:[label lineBreakMode] height];
    return height;
}

ややこしやややこしやー