cocoaのセルの高さ自動調整機能は未完成な気がしたけど、そんなこともなかったぜ
20150329追記:完全解決追記、記事タイトル修正
20150327追記:変更箇所の項目追加
最終的には完全解決
余白もなく、途切れなくなりました。いやー長かった。ハマったハマった。
LabelのSizeInspectorのExplicitのチェックを外すだけでした。原因はこれだけ。
作ったコードはこの辺。
csny/problem-CellHeightAutoResize · GitHub
セルの高さ自動調整の要点
ラベルのLinesを0。
余白を固定。
加えて、前述のExplicitと後述のUITableViewAutomaticDimension。最低限、これらの設定で、セル内のラベルに合わせて高さが自動調整される。
問題の経過
自動レイアウト調整中 - せでぃのブログ
この辺の続きをやってたんだけど、一時的に妥協することになった。
TableViewCellの幅(width)が問題だった。
TableView付属のCellのデフォルト値は幅600なんだけど、Xibにポンと置いたTableViewCellの幅のデフォルト値は320だった。
セルの幅を600にすれば直るんでしょ?
余白が大きく取られてしまう問題は解決するが、代わりにラベルの内容が途切れるという別な問題が発生する。
TableViewCellの幅(width)340、ラベル幅300あたりが、妥協点になる。ラベルは途切れなくなり、余白が多少出るもののマシになる。
ラベルの外側の余白を固定して、中身を自動調整するという仕組みのはずなので、考えても埒があかない。うーん、よくわらんし、納得いかねーし。
変更箇所
qiita.com
この記事を参考に高さ自動調整の書き方をUITableViewAutomaticDimensionを使う形に変えてみた。githubのコードも修正済み。iOS8限定とはいえ、凄い。書き方が死ぬほど簡略化できる。いや、本当すごい!楽!
いろいろいじってみたけど、今回のテーマである余白と調整失敗のジレンマについては変わっていなかった。うーんこの。
変更前
- (void)viewDidLoad { _stubCell = [self.tableView dequeueReusableCellWithIdentifier:@"Cell"]; } // セルの高さを可変にする - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { // 計測用のプロパティ"_stubCell"を使って高さを計算する [self configureCell:_stubCell atIndexPath:indexPath]; [_stubCell layoutSubviews]; CGFloat height = [_stubCell.contentView systemLayoutSizeFittingSize:UILayoutFittingCompressedSize].height; //NSLog(@"heightForRow:%f", height); return height + 1; }
変更後
- (void)viewDidLoad { // UITableViewAutomaticDimensionはiOS8から // セルの高さの計算は Autolayout に任せる self.tableView.rowHeight = UITableViewAutomaticDimension; }
はぁ? マジでこれ、すごくない?