IOS 8の新機能では、推定行の高さを設定するだけで100%の動的なテーブルビューセルを取得し、自動レイアウトを使用してセル内の要素をレイアウトできます。コンテンツの高さが増加すると、セルの高さも増加します。これは非常に便利で、テーブルビューのセクションヘッダーに対して同じ機能を実現できるかどうか疑問に思っていますか?
たとえば、tableView:viewForHeaderInSection:
にUIView
を作成し、UILabel
サブビューを追加し、ビューに対してラベルの自動レイアウト制約を指定し、tableView:heightForHeaderInSection:
を実装せずにラベルの内容に合わせてビューの高さを増加させることができますか?
viewForHeaderInSection
のドキュメントには、「このメソッドは、tableView:heightForHeaderInSection:も実装されている場合にのみ正常に機能します。」 iOS 8で何か変更があったかどうかは聞いていません。
それができない場合、この動作を模倣する最良の方法は何ですか?
これは可能です。これは、iOS 8で実装された動的なセルの高さと並んで新しいものです。
とても簡単です。これをviewDidLoad
に追加するだけです:
self.tableView.sectionHeaderHeight = UITableViewAutomaticDimension;
self.tableView.estimatedSectionHeaderHeight = 25;
次に、viewForHeaderInSection
をオーバーライドし、自動レイアウトを使用して、ビュー内の要素を適切に表示されるように制約します。それでおしまい! heightForHeaderInSection
を実装する必要はありません。また、実際にはsectionHeaderHeight
も指定する必要はありません。わかりやすくするために追加しただけです。
IOS 11では、セルおよびヘッダー/フッタービューはデフォルトで推定高さを使用することに注意してください。行うべき唯一のことは、システムに何を期待すべきかをよりよく知らせるために、推定高さを提供することです。デフォルト値はUITableViewAutomaticDimension
ですが、可能であればそれらの平均の高さであるより良い推定値を提供する必要があります。
これは、テーブルビューでestimatedSectionHeaderHeight
を設定(または返す)することで実現できます。
estimatedSectionHeaderHeight
を設定した後にセクションヘッダーがセルとオーバーラップしている場合、必ずestimatedRowHeight
も使用していることを確認してください。
(私はこの回答を追加しています。なぜなら、2番目の段落には、一部の見逃しがちなすべてのコメントを読んだ後に見つかる問題への回答が含まれているからです。)
私は試した
self.tableView.sectionHeaderHeight = UITableViewAutomaticDimension;
self.tableView.estimatedSectionHeaderHeight = 25;
しかし、複数行のラベルが付いたヘッダーのサイズは正しくありませんでした。私の問題を解決するためにこれを追加しました:
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
// Recalculates height
tableView.beginUpdates()
tableView.endUpdates()
}
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
}
私の場合:
self.tableView.sectionHeaderHeight = UITableViewAutomaticDimension
。
ストーリーボードで設定動作しない。
heightForHeaderInSection
workedをオーバーライドします。
override func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat { return UITableViewAutomaticDimension }
テスト環境:
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
}
はい、それは私のために動作します。以下のようにさらに変更する必要があります。
override func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
let label = UILabel()
label.numberOfLines = 0
label.text = my own text
return label
}