web-dev-qa-db-ja.com

UITableViewControllerで静的セルの自動高さを設定する方法は?

IBとストーリーボードを使用しており、UITableViewControllerを定義しました。そこで、3つのstaticセル​​を定義しました。最初の2つの高さは指定する必要がありますが、最後の2つは残りのスペース(ビューの下部に固定)を自動的に埋める必要があります。どうすればこれを達成できますか?コントロールに自動レイアウトを使用できますinsideセル​​ですが、セル自体はグレーアウトされています。

最良の解決策はIBからこれを行うことですが、プログラムによる解決策も歓迎します。

編集:

これは私のストーリーボードでどのように見えるかです(色は個別のコントロールを視覚化するためのもので、各コントロールには必要な制約があります): Storyboard view controller

そして起動後: Simulator view テキストビューは画面の下部で終了することに注意してください。

IOS 7.0以降をターゲットにしていることを忘れていました。

27
bpiec

これを試して

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の行をオンにしてそのサイズを返すことをお勧めします

65
Ryan Romanchuk

必ずheightForRowAtIndexPathをオーバーライドしてください!そうしないと、私の経験から正しく表示されません

override func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat 
{
    return UITableViewAutomaticDimension
} 
11
Mat0

これについては、静的テーブルビューを使用し、自動レイアウトを使用してセルの高さを設定するブログ投稿で説明しました。セルはすべて、インターフェイスビルダーで定義されます。

コードで自動セルの高さを有効にする必要がありますが、それはほんの数行です。

IBとコードを含むすべてを表示します。

ご覧ください

http://www.oliverfoggin.com/using-a-static-uitableview-as-a-layout-device/

4
Fogmeister

テーブルビューのセル全体の高さが動的な場合は、これを試すことができます

tableView.rowHeight = UITableViewAutomaticDimension
tableView.estimatedRowHeight = 240

または、TableViewには固定高さのセルと動的高さのセルが必要です。答えをチェックアウトできます 動的および静的Tableviewセルの高さ

それが役に立てば幸い。

3
Riajur Rahman

Ryan Romanchukの答えは素晴らしい。私のような初心者に役立つヒントがあります。

これは静的セルの場合であるため、すべての動的フィールドにIBOutletを使用する傾向があります。たとえばUILabelロードサイクルの外側tableViewに値を設定すると、新しい高さは考慮されません。

動的な高さを機能させるために、オーバーライドされたcellForRowAtIndexPathデリゲートに値を割り当てて、自動レイアウトが新しい高さを取得できるようにすることができます。フィールドを更新する場合は、tableView.reloadData()を呼び出します。

1
Baron Ch'ng

静的な(データドリブンではない)高さの場合、セルを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];
}
1
Tanuj

IBから不明で、自動レイアウトを使用している

しかし、プログラムを使用して、

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath

このメソッドを使用して、indexpath.rowを確認できます。これを使用すると、異なる高さが返されます。

1
svrushal