2013-02-26 11 views
6

Ich habe viele, viele Orte gesucht und muss noch einen guten Beispielcode finden, der zeigt, wie man die "nächste" Seite in einem UIPageViewController vorlädt. Es gibt ein paar Antworten auf SO, die einige theoretische Wege beschreiben, dies zu tun (siehe this question), aber bisher hat noch niemand ein funktionierendes Beispiel veröffentlicht.Nächste Seite in UIPageViewController laden

Im Arbeitsablauf meiner App zeige ich 1 Seite pro Bildschirm an und ich möchte den "nächsten" Bildschirm vorinstalliert haben, weil das Swipen auf die nächste Seite sehr langsam sein kann und manchmal 2 Swipes erfordert (wenn Sie wischen zu schnell), damit die nächste Seite gerendert und angezeigt wird. Dies führt zu einer schlechten Benutzererfahrung. Es ist mir nicht wirklich wichtig, die "vorherigen" oder andere Bildschirme vorab zu laden, da der typische Arbeitsablauf darin besteht, dass Benutzer für eine Weile auf dem Bildschirm bleiben, bevor sie zum nächsten Bildschirm (rechts) wechseln. Ich benutze die Folienanimation (nicht einrollen). Ich erstelle alle Ansichten programmatisch und benutze IB überhaupt nicht.

Ich habe versucht, einige UIViewControllers in einem NSMutableArray zu speichern und die Controller von dort zu laden, aber es ist schwierig, richtig zu arbeiten und schien nichts zu beschleunigen. Es muss einen guten Weg geben, dies zu tun.

Jede Hilfe wird sehr geschätzt.

+1

Haben Sie eine Lösung dafür gefunden? Ich habe das gleiche Problem, merkliche Verzögerung beim Wischen zum nächsten View-Controller. – mattsson

+0

Art von, aber die Antwort ist sehr spezifisch für meine Implementierung. Da ich seit der Veröffentlichung dieser Frage viel mit UIPageViewController gearbeitet habe, habe ich festgestellt, dass es ein sehr schwieriges Thema ist. Grundsätzlich hatten meine Probleme eher damit zu tun, die DB nach den richtigen Daten zu durchsuchen, die jede Seite verlangsamten. Ich konnte meine Seitenumdrehungen optimieren, indem ich Daten aus der DB vorberechnete und meine Ansichten mit Auto Layout zeichnete, anstatt mit Frames zu spielen - das half sehr. Zweitens hatte ich viele Bilder zu zeigen, also speicherte ich sie in einem NSMutableArray direkt auf dem "Haupt" View-Controller (Eltern des Swipe). – DiscDev

+0

Meine "Lösung" endete damit, dass ich darauf warte, dass Apple mit schnelleren Telefonen herauskommt .... hahaha. Auf dem iPhone 6/6s gibt es keine Verzögerung mehr.Ich habe einen Teil des Datenbankabrufcodes optimiert, der einmal beim ersten Erstellen des Seitencontrollers passiert, und das hat sehr geholfen, aber die Hauptgeschwindigkeitsverbesserungen kamen von schnelleren Prozessoren und mehr RAM und dem Auslaufen der Unterstützung für iPhone 4/4s =) – DiscDev

Antwort

0

Sie sollten Ihren Code debuggen, indem Sie z. B. den Time Profiler von Instruments verwenden. Dabei finden Sie, welches Objekt die höchste Laufzeit hat. Vielleicht hängt es nicht mit UIPageViewController zusammen, sondern mit der Ansicht innerhalb der Seiten.

2

Ich habe für meinen Fall in einem etwas von Hack gelöst. Für jede ContentView habe ich eine UIImageView innerhalb einer UIScrollView zum Zoomen. Mein Problem war, dass beim Hochfahren der App, wenn der Benutzer vor dem Wischen gezoomt hat, das Gehen auf die nächste Seite beim Vergrößern nicht gut funktionieren würde. Ich benutze den folgenden Code (Swift 1.2), um dieses Problem zu lösen. Wie gesagt, es ist ein bisschen wie ein Hack.

Im Wesentlichen lade ich die View-Controller vor und nach dem Starten der View-Controller. Ich tue dies, indem ich jedes auf den VC setze, um über setViewControllers(_:direction:animated:completion:) (see ref) zu sehen, dann durch Zurückgehen zu dem beginnenden Ansichtsteuerpult. Warum ist das in zwei verschiedenen Funktionen? Nun, wenn Sie alles in einem stecken, wird nur einer der beiden View-Controller neben dem Start-VC geladen. Dies kann in einigen Fällen wünschenswert sein, aber ich brauchte alle drei VCs (vor, starten und nachher) zu laden.

Ich bin nicht sicher, wie gut diese Methode funktionieren würde, wenn die UIPageViewController bereits geladen wurde. Zum Beispiel, wenn Sie die Seite 2 von der Seite, die angezeigt wird, laden müssen, nach ein paar Wischen. Es kann überspringen, wenn Sie es in willTransitionToViewControllers() setzen.

+0

Wie funktioniert das, wenn Sie nicht über eine festgelegte Menge an VCs verfügen? Gibt es eine Möglichkeit, alle auf einmal vorzuladen, damit es keine Probleme gibt? Vielen Dank! – Jacob

+0

@Jacob: Wenn Sie keine feste Anzahl von VCs haben, müssen Sie zuerst prüfen, ob VCs vor und nach dem ausgewählten VC vorhanden sind. Wenn nur ein VC vorhanden ist, verwenden Sie nur den Code in 'viewDidLoad()', und 'viewWillLayoutSubviews()' wird nicht verwendet. Wenn es nur eine VC davor gibt, verwenden Sie den Code in 'viewWillLayoutSubviews()', und alles in 'viewWillLoad', beginnend mit dem' // Load to the viewController nach dem Start VC ... 'Kommentar wird entfernt. Sie können in diesem Fall möglicherweise zur vorherigen VC in 'viewDidLoad()' wechseln. Ich bin nicht sicher, wie man alle VCs vorlädt, Entschuldigung. –

+0

hallo können Sie den vollständigen Code von der Initialisierung von pageViewController bereitstellen, um es abzuschließen –

Verwandte Themen