web-dev-qa-db-ja.com

iOS 11フローティングTableViewヘッダー

アプリを複数のセクションに分けて、「展開」する場合はセクションごとに数行、「折り畳む」場合はなし。各セクションにはセクションヘッダーがあり、UITableViewHeaderFooterViewなどのサブクラスを使用して再利用していました。

次に、iOS 11で:

Screenshot describing the issue

ビジュアルデバッガーを使用し、セクションヘッダーがフローティングであることを確認しました。ヘッダーの下のすべての行が正しく表示され、他のヘッダーは正常に表示されます。

正気を回復するために、ヘッダーの再利用ロジックをすべて破棄し、プログラムで作成しました。同じ同じ。すべてはiOS 11より前のバージョンで動作しますが、iOS 11でもフロートします。フロートするセクションは毎回変わるようです。

何か案は?

12
VDub19

同様の問題にぶつかり、 この問題に関する議論 が見つかりました。

self.tableView.estimatedRowHeight = 0
self.tableView.estimatedSectionHeaderHeight = 0
self.tableView.estimatedSectionFooterHeight = 0

推定高さを使用するためにiOS 11で変更されたUITableViewのデフォルトの動作のようです。 iOS 11ベータ2のリリースノートには次のように書かれています。

テーブルビューはデフォルトで推定高さを使用するようになりました。これは、セルおよびセクションヘッダー/フッタービューがデフォルトで自己サイズになるようになったことも意味します。 expectedRowHeight、estimatedSectionHeaderHeight、estimatedSectionFooterHeightプロパティのデフォルト値はUITableViewAutomaticDimensionになりました。これは、テーブルビューが使用する推定高さを選択することを意味します。可能であれば、各プロパティのより正確な推定値を提供する必要があります。これは、実際の高さの平均値の最良の推定値です。 iOS 11 SDKを使用してアプリをビルドするときに異なる動作をする既存のテーブルビューコードがあり、自己サイズ調整を採用したくない場合は、ゼロの値を設定して推定高さを無効にすることで以前の動作を復元できます各推定高さプロパティ。 (30197915)

ベータ2リリースノートも参照してください こちらにミラーリング

48
ahmedre

ahmedre アプリ全体の回答のように変更したい場合は、AppDelegate didFinishLaunchingWithOptionsでこのプロパティを設定できます。

UITableView.appearance().estimatedRowHeight = 0
UITableView.appearance().estimatedSectionHeaderHeight = 0
UITableView.appearance().estimatedSectionFooterHeight = 0
3
A.Mysik

私の場合、@ ahmedreの回答が機能しない理由はわかりません...

したがって、私の答えは、推定されたすべてのプロパティを0に設定しても機能しない場合に役立つかもしれません:

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

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

テーブルのスタイルをプレーンからグループ化に変更してみてください。

1
Anas Alhasani