web-dev-qa-db-ja.com

自動レイアウトを使用して動的なテーブルビューセクションヘッダーの高さを取得することは可能ですか?

IOS 8の新機能では、推定行の高さを設定するだけで100%の動的なテーブルビューセルを取得し、自動レイアウトを使用してセル内の要素をレイアウトできます。コンテンツの高さが増加すると、セルの高さも増加します。これは非常に便利で、テーブルビューのセクションヘッダーに対して同じ機能を実現できるかどうか疑問に思っていますか?

たとえば、tableView:viewForHeaderInSection:UIViewを作成し、UILabelサブビューを追加し、ビューに対してラベルの自動レイアウト制約を指定し、tableView:heightForHeaderInSection:を実装せずにラベルの内容に合わせてビューの高さを増加させることができますか?

viewForHeaderInSectionのドキュメントには、「このメソッドは、tableView:heightForHeaderInSection:も実装されている場合にのみ正常に機能します。」 iOS 8で何か変更があったかどうかは聞いていません。

それができない場合、この動作を模倣する最良の方法は何ですか?

93
Jordan H

これは可能です。これは、iOS 8で実装された動的なセルの高さと並んで新しいものです。

とても簡単です。これをviewDidLoadに追加するだけです:

self.tableView.sectionHeaderHeight = UITableViewAutomaticDimension;
self.tableView.estimatedSectionHeaderHeight = 25;

次に、viewForHeaderInSectionをオーバーライドし、自動レイアウトを使用して、ビュー内の要素を適切に表示されるように制約します。それでおしまい! heightForHeaderInSectionを実装する必要はありません。また、実際にはsectionHeaderHeightも指定する必要はありません。わかりやすくするために追加しただけです。

IOS 11では、セルおよびヘッダー/フッタービューはデフォルトで推定高さを使用することに注意してください。行うべき唯一のことは、システムに何を期待すべきかをよりよく知らせるために、推定高さを提供することです。デフォルト値はUITableViewAutomaticDimensionですが、可能であればそれらの平均の高さであるより良い推定値を提供する必要があります。

241
Jordan H

これは、テーブルビューでestimatedSectionHeaderHeightを設定(または返す)することで実現できます。

estimatedSectionHeaderHeightを設定した後にセクションヘッダーがセルとオーバーラップしている場合、必ずestimatedRowHeightも使用していることを確認してください。

(私はこの回答を追加しています。なぜなら、2番目の段落には、一部の見逃しがちなすべてのコメントを読んだ後に見つかる問題への回答が含まれているからです。)

22
Clay Ellis

私は試した

self.tableView.sectionHeaderHeight = UITableViewAutomaticDimension;
self.tableView.estimatedSectionHeaderHeight = 25;

しかし、複数行のラベルが付いたヘッダーのサイズは正しくありませんでした。私の問題を解決するためにこれを追加しました:

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)

    // Recalculates height
    tableView.beginUpdates()
    tableView.endUpdates()
}
6
iuriimoz

heighForHeaderInSectionのデリゲートで固定の高さを指定しない限り、ヘッダーの高さがゼロになるという同じ問題に巻き込まれました。

含む多くのソリューションを試しました

self.tableView.sectionHeaderHeight = UITableViewAutomaticDimension;
self.tableView.estimatedSectionHeaderHeight = 73`

しかし、何もうまくいきませんでした。私のセルも適切な自動レイアウトを使用していました。次のコードを使用して行の高さを動的に変更していましたが、セクションヘッダーは変更していませんでした。

self.tableView.estimatedRowHeight = 135
self.tableView.rowHeight = UITableViewAutomaticDimension`

修正も非常に簡単で奇妙ですが、estimatedSectionHeaderHeightおよびsectionHeaderHeightの1行コードの代わりにデリゲートメソッドを実装する必要がありました。

func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
    return UITableViewAutomaticDimension
}

func tableView(_ tableView: UITableView, estimatedHeightForHeaderInSection section: Int) -> CGFloat {
    return 73
}
4
Ahsan Ebrahim

私の場合:

  1. プログラムで設定動作しない

self.tableView.sectionHeaderHeight = UITableViewAutomaticDimension

  1. ストーリーボードで設定動作しない

  2. heightForHeaderInSectionworkedをオーバーライドします。

override func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
    return UITableViewAutomaticDimension
}

テスト環境:

  • Mac OS 10.13.4
  • XCodeバージョン9.4.1
  • シミュレーターiPhone 8 Plus
1
Codus

Swift 4 +

working(Tested 100%)

コンテンツに基づいて動的な高さを持つ行とセクションの両方が必要な場合は、以下のコードを使用できます:

ViewDidLoad()で、次の行を記述します。

    self.globalTableView.estimatedRowHeight = 20
    self.globalTableView.rowHeight = UITableView.automaticDimension

    self.globalTableView.sectionHeaderHeight =  UITableView.automaticDimension
    self.globalTableView.estimatedSectionHeaderHeight = 25;

UITableView Delegateメソッドを使用して、行の高さとセクションの高さを設定しました。

func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat
   {
       return UITableView.automaticDimension
   }
   func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {

       return UITableView.automaticDimension

   }
1

はい、それは私のために動作します。以下のようにさらに変更する必要があります。

override func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
    let label = UILabel()

    label.numberOfLines = 0
    label.text          = my own text

    return label
}
0
arg_vn