

`TableView`のセルの大きさをコンテンツの内容に応じて変えたいのですが、どうすればいいのかが分かりません。例えば以下のような`TableView`のセルがあるとします。

[![画像の説明をここに入力](https://i.stack.imgur.com/PMM4x.jpg)](https://i.stack.imgur.com/PMM4x.jpg)

このセルの一番上にある`TextView`の行が増えたり減ったりすることに応じてセルの高さを変えたいです。これを実現するには`AutoLayout`だけで可能でしょうか？  
また、`TextView`の下にある画像は表示するかしないかが選択でき、画像を表示しない場合だと`ImageView`がなくなった分だけセルの高さを縮めるといったことも行いたいです。  
以上のことを行うにはどうすればいいでしょうか？  
自分で`AutoLayout`を設定したりしたものの、セルの高さがずっと変わりません。  
どなたか分かる方がいれば教えていただきたいです。  
すみませんが、宜しくお願いします。

\---追記---

iOSのバージョンは9.0.1、Xcodeのバージョンは7.0.1で、Storyboardを使っています。


CC BY-SA 3.0
2015-10-05T09:49:08.180
17271
2016-10-20T15:00:29.477
2015-10-06T00:54:05.487
5210
5210
question
ios objective-c uitableview autolayout
TableViewのセルの大きさを可変にする


> (CGFloat)tableView:heightForRowAtIndexPath  
>  読んで字のごとく、各行の高さを決めるメソッド。  
>  tableView:cellForRowAtIndexPath: よりも先に呼び出される。

<http://qiita.com/kotaroito/items/8bd2f10833e07f7a5809>

[code]

    コードをここに入力- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{
    // 表示したい文字列
    NSString     *text = _objects[indexPath.row];
    // 表示最大幅・高さ
    CGSize     maxSize = CGSizeMake(200, CGFLOAT_MAX);
    // 表示するフォントサイズ
    NSDictionary *attr = @{NSFontAttributeName: [UIFont boldSystemFontOfSize:17.0]};
    
    // 以上踏まえた上で、表示に必要なサイズ
    CGSize modifiedSize = [text boundingRectWithSize:maxSize
                                             options:NSStringDrawingUsesLineFragmentOrigin
                                          attributes:attr
                                             context:nil
                           ].size;
    
    // 上下10pxずつの余白を加えたものと70pxのうち、大きい方を返す
    return MAX(modifiedSize.height + 20, 70);}
    
[/code]


CC BY-SA 3.0
2015-10-22T08:50:48.820
17946
2015-10-22T09:05:26.533
2015-10-22T09:05:26.533
12902
12902
17271
answer


おそらくTextViewはスクロールさせないだろうという前提です。

Storyboardでは  
\- TextViewには高さのConstraintは設定しない。上下左右のConstraintは設定する。  
\- TextViewのScrolling Enabledはオフにする。  
\- ImageViewには高さのConstraintを設定して、カスタムセルにIBOutletプロパティとして持たせる。

コードでは  
\-
viewDidLoaded()あたりでrowHeightとestimatedRowHeightをテーブルに設定する。estimatedRowHeightはご自身のセルに合わせてだいたいの値を設定する。

[code]

    self.tableView.rowHeight = UITableViewAutomaticDimension;
    self.tableView.estimatedRowHeight = 100.0;
    
[/code]

  * 画像を表示しない場合はtableView(tableView:cellForRowAtIndexPath:)でStoryboardで設定したImageViewの高さConstraintに0.0を設定する。

以上でAutoLayoutのみでTextViewの高さが自動的に変わり、ImageViewが必要ない場合にその分セルの高さが小さくなると思います。

もしTextViewをスクロール可能な状態で高さを制限したい場合は、UITextViewのサブクラスでintrinsicContentSizeをオーバーライドすることになるはずです。


CC BY-SA 3.0
2016-03-20T14:03:42.397
23301
2016-03-21T00:00:07.243
2016-03-21T00:00:07.243
238
238
17271
answer