上記のように、UITableView では、ヘッダーの高さは自動レイアウトではなく、
-(CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section
フッターの高さは
-(CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section
そして最後に、セルの高さが設定されます
-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{
テーブルビューは、ストーリーボード、XIB ファイル、またはコードからセルをロードします。上記のメソッドを使用して、ヘッダー、フッター、およびセルのフレームのサイズを設定し、そのスペースに収まるようにビューのサイズを設定します。
自動レイアウトはこれらのサイズを変更しないことを理解することが重要です。コンテナー内のビューをレイアウトするために使用されるルールのみを処理します。
セル/ヘッダー/フッターが静的サイズを使用している場合、それは非常に簡単です。すべてのサブビューの高さをロックし、heightFor で返すのと同じサイズになるようにセルを設定するだけです。
動的なセル/ヘッダー/フッターには、もう少し作業が必要です。
基本的に、実際に作成してすべてのサブビューのサイズを調整する前に、セル/ヘッダー/フッターのサイズをテーブルビューに伝えるように求められます。
cellForRowAtIndexPath および heightForRowAtIndexPath メソッドにブレークポイントを設定することで、これをすばやくテストできます。高さが最初に呼び出されます。
動的な tableviewcell の高さの場合、一般的なトリックは、viewDidLoad で単一のセルを作成し、高さを計算するために保存することです。次に、heightForRowAtIndexPath または heightForHeaderInSection に到達したら、事前に作成されたセルを使用して、最終セルで使用する値を入力します。UILabels には sizeWithFont (iOS 7 より前) または boundingRectWithSize (iOS 7.0 以降) を使用し、UITextViews には sizeThatFits を使用します。(将来これを読む人は、それらのメソッドが新しいものに置き換えられていないことを確認してください)
したがって、必要なテキストをダミーセルに入れ、ラベルとテキストビューの高さを取得し、それらの間にスペースを追加し、完了したら最終サイズを返します。
次に、 cellForRowAtIndexPath または headerForSection で値の設定をやり直しますが、表示される実際のセルで行います。
高さの計算が自動レイアウト設定と一致する場合、すべてがそのために作られたスペースに完全に収まります。
既に描画された後にセルまたはヘッダーの高さを変更する場合は、次のようにしてテーブルビューを更新する必要があります。
[self.tableView beginUpdates];
// change the data that will cause cell height to be different in heightForCellAtIndexPath or which will change a header or footer height calculation
[self.tableView endUpdates];
これにより、テーブルビューがサイズをチェックし、変更された場合にのみセルまたはヘッダー/フッターを更新します。