9

ページベースのアプリケーションを作成し、いくつかの実験のために少しハッキングしました。私の単純な目的は、UITableView を保持する UIViewController がページに含まれる UIPageViewController を作成することです (さらに調査した結果、代わりに UITableViewController を使用した場合、実験の結果は同じになります)。これを行うには、プロジェクト テンプレートを編集し、このスクリーンショットでわかるように、Storyboard の ContainerView オブジェクトを使用して、UIPageViewController を RootViewController の埋め込みビューとして追加しました。

ストーリーボードのコントローラー

すべてのコントローラーは、スクロール ビューのコンテンツ インセットを自動的に調整するようにストーリーボードを介して構成されます。この構成でプロジェクトを開始すると、すべて問題なく表示され、DataViewController のテーブルビューのコンテンツ インセットがナビゲーション バーのすぐ下で期待どおりに適切に調整されます。ただし、ユーザーがテーブルビューを操作すると、コンテンツ インセットが壊れ、テーブルビューがナビゲーション バーの下に重なって表示されます。

uipageviewcontroller と tableview のコンテンツ インセットの問題

DataViewController の viewDidLayoutSubview メソッドでコンテンツ インセットを手動で設定し、任意のコントローラーで Adjusts Scroll View Insets を無効にすることでこれを修正できたので、問題を解決するための答えとしてこれは必要ありません。私の質問は、最初のコントローラーが初めてストーリーボードからロードされた直後にコンテンツのインセットが適切に設定される理由と、何らかのユーザー操作の後にそれらが壊れる理由です。

直接テストする必要がある場合は、プロジェクトへのリンクがあります

4

3 に答える 3

16

100% 確信が持てませんが、セットアップに関する説明は次のとおりです。

デフォルトでは、UIViewController不透明でないバーの背後にコンテンツを拡張し、スクロール ビューのインセットを調整するように s が構成される傾向があります。上記のセットアップでは、これはコンテナー VC が次のことを意味します。

  • ナビゲーション バーの背後に表示されるようにコンテンツを拡張します
  • スクロールビューの.contentInset.scrollIndicatorInsetsをナビゲーション バーと同じ高さに設定します

「でも、あっ!」「あのコンテナ ビュー コントローラにはスクロール ビューがありません」と言うのを耳にします。さて、これはトリッキーなビットです:

UIViewController's「私のスクロールビュー」の定義は、かなり単純化されているようで、「ビュー階層を下に検索したときに最初に表示されるスクロールビュー」です。

UIPageViewControllerたまたまスクロールビューを使用して実装されています。したがって、コンテナー VC はそのスクロール ビューを見つけて、その上部のインセットを調整します。これは実際には望んでいるものではありません。ページコントローラーを混乱させ、ある時点でレイアウトを混乱させる傾向があります。

単純な解決策は.automaticallyAdjustsScrollViewInsets、コンテナ ビュー コントローラを無効にすることです。

次に、テーブル ビューの次の問題を解決する必要があります。ナビゲーション バーを考慮して、ある種のトップ インセットが必要です。これまでのところ、これを行う最善の方法は、ストーリーボードまたはコードで手動で行うことです。

于 2014-10-28T20:39:41.517 に答える