IBとストーリーボードを使用しており、UITableViewController
を定義しました。そこで、3つのstaticセルを定義しました。最初の2つの高さは指定する必要がありますが、最後の2つは残りのスペース(ビューの下部に固定)を自動的に埋める必要があります。どうすればこれを達成できますか?コントロールに自動レイアウトを使用できますinsideセルですが、セル自体はグレーアウトされています。
最良の解決策はIBからこれを行うことですが、プログラムによる解決策も歓迎します。
編集:
これは私のストーリーボードでどのように見えるかです(色は個別のコントロールを視覚化するためのもので、各コントロールには必要な制約があります):
そして起動後: テキストビューは画面の下部で終了することに注意してください。
IOS 7.0以降をターゲットにしていることを忘れていました。
これを試して
func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat{
if indexPath.row == 0 {
return firstRowHeight
}
else if indexPath.row == 1 {
return secondRowHeight
}
else {
return tableView.frame.size.height - firstRowHeight - secondRowHeight
}
}
問題になる可能性がある唯一のことは、ビューがtableViewの高さを設定する前にこのメソッドが実行されることです。
実際には、静的セルでUITableViewAutomaticDimension
を使用できます。通常どおりに静的セルを設計し、追加して手動でセルを動的な高さに設定します
tableView.rowHeight = UITableViewAutomaticDimension
tableView.estimatedRowHeight = 240 // Something reasonable to help ios render your cells
heightForRow
デリゲートをオーバーライドします
override func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {
return UITableViewAutomaticDimension
}
この手法で気付いた他の唯一の注意点は、NSAutolayout
を使用して下部のコンテナー(UITableViewCell
のコンテナー)に制約を作成する必要があることです。したがって、セルのcontentView内に動的な高さを持つコンテナがあるとしましょう。これを適切にレンダリングするには、下部スペース制約を作成する必要があります。
高さが固定されている静的セルがある場合は、tableView:heightForRowAtIndexPath:indexPath
の行をオンにしてそのサイズを返すことをお勧めします
必ずheightForRowAtIndexPathをオーバーライドしてください!そうしないと、私の経験から正しく表示されません
override func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat
{
return UITableViewAutomaticDimension
}
これについては、静的テーブルビューを使用し、自動レイアウトを使用してセルの高さを設定するブログ投稿で説明しました。セルはすべて、インターフェイスビルダーで定義されます。
コードで自動セルの高さを有効にする必要がありますが、それはほんの数行です。
IBとコードを含むすべてを表示します。
ご覧ください
http://www.oliverfoggin.com/using-a-static-uitableview-as-a-layout-device/
テーブルビューのセル全体の高さが動的な場合は、これを試すことができます
tableView.rowHeight = UITableViewAutomaticDimension
tableView.estimatedRowHeight = 240
または、TableViewには固定高さのセルと動的高さのセルが必要です。答えをチェックアウトできます 動的および静的Tableviewセルの高さ
それが役に立てば幸い。
Ryan Romanchukの答えは素晴らしい。私のような初心者に役立つヒントがあります。
これは静的セルの場合であるため、すべての動的フィールドにIBOutlet
を使用する傾向があります。たとえばUILabel
ロードサイクルの外側tableView
に値を設定すると、新しい高さは考慮されません。
動的な高さを機能させるために、オーバーライドされたcellForRowAtIndexPath
デリゲートに値を割り当てて、自動レイアウトが新しい高さを取得できるようにすることができます。フィールドを更新する場合は、tableView.reloadData()
を呼び出します。
静的な(データドリブンではない)高さの場合、セルを1回だけデキューして、高さを保存できます。
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSNumber *height;
if (!height) {
UITableViewCell *cell = [self.tableView dequeueReusableCellWithIdentifier:@"MyCustomCell"];
height = @(cell.bounds.size.height);
}
return [height floatValue];
}
IBから不明で、自動レイアウトを使用している
しかし、プログラムを使用して、
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
このメソッドを使用して、indexpath.rowを確認できます。これを使用すると、異なる高さが返されます。