せでぃのブログ

ブログ初心者おいどんのどうでもいい愚痴やどうでもいい愚痴やどうでもいいマメ知識などを披露するチラシの裏です。

cocoaのセルの高さ自動調整機能は未完成な気がしたけど、そんなこともなかったぜ

20150329追記:完全解決追記、記事タイトル修正
20150327追記:変更箇所の項目追加

最終的には完全解決

 余白もなく、途切れなくなりました。いやー長かった。ハマったハマった。
f:id:Sediment:20150329000059p:plain
 LabelのSizeInspectorのExplicitのチェックを外すだけでした。原因はこれだけ。
f:id:Sediment:20150329000120p:plain
 作ったコードはこの辺。
csny/problem-CellHeightAutoResize · GitHub

セルの高さ自動調整の要点

 ラベルのLinesを0。
f:id:Sediment:20150329000818p:plain
 余白を固定。
f:id:Sediment:20150329000845p:plain
 加えて、前述のExplicitと後述のUITableViewAutomaticDimension。最低限、これらの設定で、セル内のラベルに合わせて高さが自動調整される。

問題の経過

自動レイアウト調整中 - せでぃのブログ
 この辺の続きをやってたんだけど、一時的に妥協することになった。

 TableViewCellの幅(width)が問題だった。
 TableView付属のCellのデフォルト値は幅600なんだけど、Xibにポンと置いたTableViewCellの幅のデフォルト値は320だった。
f:id:Sediment:20150326022110p:plain
f:id:Sediment:20150326023928p:plain

セルの幅を600にすれば直るんでしょ?

 余白が大きく取られてしまう問題は解決するが、代わりにラベルの内容が途切れるという別な問題が発生する。
f:id:Sediment:20150326022445p:plain
 TableViewCellの幅(width)340、ラベル幅300あたりが、妥協点になる。ラベルは途切れなくなり、余白が多少出るもののマシになる。
f:id:Sediment:20150326023205p:plain

 ラベルの外側の余白を固定して、中身を自動調整するという仕組みのはずなので、考えても埒があかない。うーん、よくわらんし、納得いかねーし。

変更箇所

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;
}

 はぁ? マジでこれ、すごくない?