可変高さのUITableViewCell(sizeWithFont)…は信用できるのか?
複数行のテキストがあり、テキストに応じてUITableViewCellの高さを調整したい。
よくある話で、セルの高さはcellForRowAtIndexPathで設定できないので地味に面倒くさい。
可変高さのUITableViewCellを作る方法は面倒だけど難しくはないです。
- UITableViewでheightForRowAtIndexPathをセルの高さに応じて返してあげる
- 高さの計算には、sizeWithFontを使って高さを計算する
が、どうも小さすぎてはみ出す or 大きすぎて余る場合があるようなないような…?
一度確かめてみたかったので、試してみました。
フォントに応じて、はみ出たりはみ出なかったりするというと、MS Excelを思い出すわけで、天下のMSができなかったのだから、フォント周りは相当大変なのでしょう、きっと…。
結論を書いておきますと、ずれることはありませんでした。悪いのはsizeWithFontではなく、自分でした、サーセン。
はみ出したり、余白があいたるする場合は、実際の幅と計算で使った幅が違うとか、フォントサイズが違うとか、を疑うのです。
以下蛇足ですが、実験結果。
TextCellというUILabelを1つ持つセルを作り、高さ計算のstaticメソッドを追加してやります。
+ (CGFloat)heightForCell:(NSString*)text size:(CGFloat)size width:(CGFloat)width { return [text sizeWithFont:[UIFont systemFontOfSize:size] constrainedToSize:CGSizeMake(width, 200000) lineBreakMode:NSLineBreakByTruncatingTail].height; }
heightForRowAtIndexPathでそれを呼んでやります。
今回はtextForIndexなるメソッドで適当なテキスト(うわぁ+ん)を返すようにしています。
実際は表示対象のオブジェクトから取るのでしょうね。
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { return [TextCell heightForCell:[self textForIndex:indexPath.row] size:fontSize width:self.view.frame.size.width]; }
今回はフォントサイズを弄れるようにしました。
作ったソースコードは例のごとくgithubに。