迅速なソリューション
このソリューションは、Swift の iOS 8 以降を対象としています。
私のアプリのルート ビュー コントローラーはナビゲーション コントローラーです。最初に、このナビゲーション コントローラーはUIViewController
スタック上に 1 つあり、これを親ビュー コントローラーと呼びます。
ユーザーがナビゲーション バーのボタンをタップすると、親ビュー コントローラーは、コンテインメント API を使用して、ビュー上の 2 つの子ビュー コントローラーを切り替えます (マップされた結果とリストされた結果を切り替えます)。親ビュー コントローラーは、2 つの子ビュー コントローラーへの参照を保持します。2 番目の子 View Controller は、ユーザーがトグル ボタンを初めてタップするまで作成されません。automaticallyAdjustsScrollViewInsets
2 番目の子ビュー コントローラーはテーブル ビュー コントローラーであり、プロパティの設定方法に関係なく、ナビゲーション バーの下に重なるという問題が発生しました。
これを修正するために、子テーブル ビュー コントローラーが作成された後、親ビュー コントローラーのメソッド内で呼び出しますadjustChild:tableView:insetTop
(以下を参照) 。viewDidLayoutSubviews
子View Controllerのテーブルビューと親View Controllerのテーブルビューは、このようtopLayoutGuide.length
にメソッドに渡されadjustChild:tableView:insetTop
ます...
// called right after childViewController is created
adjustChild(childViewController.tableView, insetTop: topLayoutGuide.length)
AdjustChild メソッドは...
private func adjustChild(tableView: UITableView, insetTop: CGFloat) {
tableView.contentInset.top = insetTop
tableView.scrollIndicatorInsets.top = insetTop
// make sure the tableview is scrolled at least as far as insetTop
if (tableView.contentOffset.y > -insetTop) {
tableView.contentOffset.y = -insetTop
}
}
このステートメントtableView.scrollIndicatorInsets.top = insetTop
は、テーブル ビューの右側にあるスクロール インジケーターを調整して、ナビゲーション バーのすぐ下から開始するようにします。これは微妙で、気がつくまでは見過ごされがちです。
以下は、次のviewDidLayoutSubviews
ように見えるものです...
override func viewDidLayoutSubviews() {
if let childViewController = childViewController {
adjustChild(childViewController.tableView, insetTop: topLayoutGuide.length)
}
}
上記のコードはすべて、親ビュー コントローラーに表示されることに注意してください。
Christopher Pickslay の「iOS 7 のテーブル ビューでコンテンツ インセットを自動調整できない」という質問に対する回答の助けを借りて、これを理解しました。