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]