可変高さのUITableViewCell(sizeWithFont)…は信用できるのか?

big

複数行のテキストがあり、テキストに応じて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];
}

今回はフォントサイズを弄れるようにしました。

small
小さいフォントでもOK.

height
大きいフォントでもOK.

作ったソースコードは例のごとくgithubに。