UITableViewCellの高さを動的に変更する

UITableViewCellの高さを動的に変更したい場合ありますよね、これ何度やっても覚えないのでメモっておきます。

とりあえず必要なのが

・cell全体の高さ

・動的に変更されるUILabelの高さ

・UILabel以外の高さ(余白ともいう)

それぞれ

[objc]

float cellheight = cell.frame.size.height;

float labelheight = label.frame.size.height;

float etcheight = cellheight - labelheight;

[/objc]

こんな感じで求めることができます。(シンプルなlabel1個+余白の場合)

で、動的に変わるのがlabelheightであって、これがテキストの長さ、テキストのfont、横幅などから動的に計算する必要があります

そんなの自分で計算できるわけないので、ググるとでてくる

[objc]

[NSString:sizeWithFont:constrainedToSize:lineBreakMode:]

[/objc]

ってやつを使います。

constrainedToSizeは最大サイズ(CGSizeMake(label.width, 2000))を適宜いれます。

lineBreakModeはUILineBreakModeCharacterWrapにするので、対象のUILabelのlineBreakModeをUILineBreakModeCharacterWrapにしておきます。

[objc]

label.lineBreakMode = UILineBreakModeCharacterWrap;

[/objc]

とか設定しておきます。

で、最終的には「labelheight(動的に変わる) + etcheight = cellheight」となるようにします。

cellの高さは

[objc]

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath

[/objc]

で変更します。

理屈さえわかればそんなに難しくないはず。と思いながら、適当に書いてるので間違ってたらごめんなさい。

http://pirosikick.hateblo.jp/entry/20100816/1281972881

【追加】忘れてた

[objc]

label.numberOfLines = 0;

[/objc]

これ設定する必要あります。

【追加】もう1つ忘れてた。「- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath」ここで labelの高さを更新してあげないと、cellの高さだけしか、変わりません。

[objc]

CGSize size = [dynamictext sizeWithFont:label.font

constrainedToSize:CGSizeMake(label.bounds.size.width, 2000)

lineBreakMode:UILineBreakModeCharacterWrap];

label.frame = CGRectMake(label.frame.origin.x,

label.frame.origin.y,

label.bounds.size.width,

size.height);

label.text = dynamictext;

[/objc]