7

Ich habe eine Page-basierte Anwendung erstellt und es ein wenig für einige Experimente gehackt; Mein einfaches Ziel ist es, einen UIPageViewController zu haben, dessen Seiten einen UIViewController enthalten, der ein UITableView enthält (nach einer weiteren Überprüfung ist das Ergebnis meines Experiments dasselbe, wenn ich stattdessen einen UITableViewController verwende). Um dies zu tun, habe ich einfach die Projektvorlage bearbeitet und hinzugefügt, um die UIPageViewController als eingebettete Ansicht der RootViewController Storyboard der ContainerView-Objekt, wie Sie in diesem Screenshot sehen:Warum werden Inhaltseinfügungen eines UITableView in einem UIPageViewController direkt nach einer Interaktion unordentlich?

storyboard's controllers

Jeder Controller konfiguriert ist, über das Storyboard, um den Inhalt der Bildlaufansicht automatisch anzupassen. Wenn ich das Projekt mit dieser Konfiguration starte, sieht alles gut aus und die Inhaltseinblendungen des DataViewControllers werden wie erwartet korrekt unter der Navigationsleiste angepasst. jedoch, wenn der Benutzer eine Interaktion mit dem Tableview macht, brechen die Inhalte Einsätze und die Tableview unterlappt die Navigationsleiste:

content inset issue with uipageviewcontroller and a tableview

Ich habe dies manuell beheben kann die Content-Einsätze in DataViewController der viewDidLayoutSubview Methode Einstellung und durch Deaktivierung Passt Scroll View Insets auf jeden Controller an, also brauche ich das nicht als Antwort, um mein Problem zu lösen. Meine Frage ist, warum die Inhaltseinfügungen richtig eingestellt sind, gleich nachdem der erste Controller beim ersten Mal vom Storyboard geladen wurde und warum sie nach jeder Art von Benutzerinteraktion unterbrochen werden.

Wenn Sie sie brauchen direkt zu testen, here ‚einen Link zum Projekt

Antwort

14

Ich bin nicht 100% sicher, dass es ist, was in Sie laufen, aber hier ist eine Erklärung in Bezug auf Ihre Setup:

standardmäßig UIViewController s sind so konfiguriert, dass sie ihren Inhalt hinter nicht opaken Balken erweitern und die Bildlaufeinschübe anpassen. In Ihrem Setup oben bedeutet dies, dass der Behälter VC:

  • erweitert seine Inhalte, um hinter der Navigationsleiste erscheint
  • Setzt seine Scroll der .contentInset und .scrollIndicatorInsets die gleiche Höhe wie die Navigationsleiste sein

"Aber, ah!" Ich höre Sie sagen, "dieser Container-View-Controller hat keine Bildlaufansicht". Nun, das ist das knifflige Bit:

Es scheint UIViewController's Definition von "meine Bildlaufansicht" ist ziemlich einfach, "die erste Bildlaufansicht, die ich bei der Suche nach unten durch meine Sicht Hierarchie".

UIPageViewController passiert mit einer Bildlaufansicht implementiert werden. Daher findet der Container-VC diese Bildlaufansicht und passt seine oberen Einfügungen an. Das ist nicht wirklich was du willst; Es verwirrt den Seitencontroller und neigt dazu, das Layout irgendwann zu stören.

Die einfache Lösung dort ist einfach .automaticallyAdjustsScrollViewInsets für den Container-View-Controller zu deaktivieren.

Sie müssen dann das nächste Problem Ihrer Tabellenansicht lösen, die eine Art von oberen Einfügungen benötigt, um die Navigationsleiste zu berücksichtigen. Bis jetzt scheint es mir der beste Weg dies manuell im Storyboard oder Code zu tun.

+0

Wow ich stolperte über das GENAUE gleiche Problem und ich goste es verzweifelt (denkend, dass ich nie eine Antwort finden würde, weil ich einen dummen Fehler gemacht haben muss), aber hier bist du, Retter! Danke – Starscream

+0

Danke Mike, das ist genau das, was ich brauchte !! –

0

Haben Sie versucht, die Auto-Layout-Einschränkung in der Behälteransicht des Root-View-Controller in der Storyboard-Befestigung (das heißt, der obere Raum constraint sollte im Zusammenhang mit dem Top Layout Guide und nicht dem Superview mit constant = 0 gesetzt werden? Sie werden nur verlieren die Wirkung der Tabellenansicht unter der Navigationsleiste Scrollen

+0

Das Problem ist, ich kann diesen Effekt wegen DES nicht verlieren Entscheidungen treffen. –

+0

Und auf jeden Fall habe ich einen Weg gefunden, es zu beheben, mi Frage ist warum passiert das? –

7

eine elegante Lösung gefunden:

  1. Von Ihrem Storyboard, Ihren Inspektoren UIPageViewController
  2. im Attribute auswählen, deaktivieren die Option ViewController =>Extend Edges =>Under Top Bars
  3. das alles ist, nicht seltsam UI Hacks
+0

das ist der Mörder! Vielen Dank – epolyakov

+0

Ja, das war die richtige Lösung für mich. Die Verwendung von automaticallyAdjustScrollViewInets hat nicht funktioniert. In meinem Fall hatte ich einen UIPageViewController in einem Navigationscontroller. Der UIPageViewController hat UICollectionViewController für jede Seite erstellt. Die Einstellung automaticallyAdjustScrollViewInsets = false führte dazu, dass die Seite bereits hochgeschoben wurde. automaticallyAdjustScrollViewInsets = true verursachte, dass die Seite hochsprang, wenn die Seite zu scrollen begann. – blinkmacalahan