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