Ist es möglich, programmgesteuert umzublättern UIPageViewController
?
ios
ios5
uikit
uipageviewcontroller
RAGOpoR
quelle
quelle
Antworten:
Ja, mit der Methode ist es möglich:
Dies ist die gleiche Methode, die zum Einrichten des ersten Ansichtscontrollers auf der Seite verwendet wird. Ebenso können Sie damit andere Seiten aufrufen.
Frage mich, warum
viewControllers
ein Array und kein Single View Controller ist?Dies liegt daran, dass ein Seitenaufruf-Controller (wie in iBooks) einen "Rücken" haben kann, auf dem jeweils 2 Seiten Inhalt angezeigt werden. Wenn Sie jeweils 1 Seite Inhalt anzeigen, übergeben Sie einfach ein Array mit 1 Elementen.
Ein Beispiel in Swift:
quelle
Da ich das auch brauchte, werde ich näher darauf eingehen, wie das geht.
Hinweis: Ich gehe davon aus, dass Sie das Standardvorlagenformular zum Generieren Ihrer
UIPageViewController
Struktur verwendet haben - das sowohl dasmodelViewController
als auchdataViewController
das beim Aufrufen erstellte Formular enthält . Wenn Sie nicht verstehen, was ich geschrieben habe, gehen Sie zurück und erstellen Sie ein neues Projekt, das dasUIPageViewController
als Grundlage verwendet. Du wirst es dann verstehen.Wenn Sie also zu einer bestimmten Seite blättern müssen, müssen Sie die verschiedenen Teile der oben aufgeführten Methode einrichten. Für diese Übung gehe ich davon aus, dass es sich um eine Landschaftsansicht handelt, in der zwei Ansichten angezeigt werden. Außerdem habe ich dies als IBAction implementiert, damit es per Knopfdruck ausgeführt werden kann oder was nicht - es ist genauso einfach, einen Auswahlaufruf durchzuführen und die benötigten Elemente weiterzugeben.
Für dieses Beispiel benötigen Sie also die beiden angezeigten Ansichts-Controller - und optional, ob Sie im Buch vorwärts oder rückwärts gehen.
Beachten Sie, dass ich lediglich fest codiert habe, wohin ich auf den Seiten 4 und 5 gehen und einen Vorwärtsbeleg verwenden soll. Von hier aus können Sie sehen, dass Sie nur die Variablen übergeben müssen, die Ihnen helfen, diese Elemente zu erhalten ...
quelle
Hier ist ein weiteres Codebeispiel für eine einzelne Seitenansicht. Die Implementierung für viewControllerAtIndex wird hier weggelassen. Sie sollte den richtigen View Controller für den angegebenen Index zurückgeben.
Seiten können durch Aufruf geändert werden
quelle
Ich könnte hier etwas völlig vermissen, aber diese Lösung scheint viel einfacher zu sein als viele andere vorgeschlagen.
quelle
Dieser Code hat bei mir gut funktioniert, danke.
Das habe ich damit gemacht. Einige Methoden zum Vorwärts- oder Rückwärtsgehen und eine zum direkten Aufrufen einer bestimmten Seite. Es ist für ein 6-seitiges Dokument in der Porträtansicht. Es funktioniert einwandfrei, wenn Sie es in die Implementierung des RootControllers der pageViewController-Vorlage einfügen.
quelle
Swift 4:
Ich musste zum nächsten Controller wechseln, wenn ich als nächstes auf einen Seitencontroller-Ansichtscontroller tippe und auch den pageControl-Index aktualisiere. Dies war also die beste und einfachste Lösung für mich :
quelle
Was ist mit Methoden aus dataSource?
Analog für rückwärts.
quelle
In Swift :
quelle
Bei Verwendung dieses Methodenaufrufs 'self.pageViewController setViewControllers' wird jedoch nicht 'viewDidDissapear' auf dem viewController für die Seite aufgerufen, die abgelehnt wurde, während beim manuellen Umblättern einer Seite viewDidDissapear auf der abgelehnten Seite aufgerufen wird. Ich glaube, das ist die Ursache für meinen Absturz
"Die Anzahl der bereitgestellten View-Controller (0) stimmt nicht mit der Anzahl überein, die für den angeforderten Übergang erforderlich ist (1)."
quelle
Ich brauchte auch eine Schaltfläche, um auf einem PageViewController nach links zu navigieren, eine, die genau das tun sollte, was Sie von der Wischbewegung erwarten würden.
Da in " pageViewController: viewControllerBeforeViewController " bereits einige Regeln für den Umgang mit der natürlichen Swipe-Navigation vorhanden waren, wollte ich, dass die Schaltfläche den gesamten Code wiederverwendet, und konnte es mir einfach nicht leisten, bestimmte Indizes zu verwenden zu verwenden, um Seiten wie zuvor zu erreichen Antworten haben. Also musste ich eine alternative Lösung wählen.
Bitte beachten Sie, dass der folgende Code für einen Page View Controller gilt, der eine Eigenschaft in meinem benutzerdefinierten ViewController ist und dessen Rücken auf Mitte gesetzt ist.
Hier ist der Code, den ich für meine Schaltfläche Nach links navigieren geschrieben habe:
Sie können von hier aus etwas sehr Ähnliches tun, um eine rechte Navigationsschaltfläche zu erstellen.
quelle
Falls PAGE CONTROL zur Anzeige der aktuellen Seite O && ist. Sie möchten, dass Seiten per Bildlauf navigieren und auch auf benutzerdefinierte Schaltflächen in Page ViewController klicken. Dies kann hilfreich sein.
// Delegierten namens viewControllerAfterViewController delegieren, wenn Benutzer zur nächsten Seite blättern
}}
}}
// Benutzerdefinierte Schaltfläche (Zurück & Weiter) Logik
}}
}}
quelle
// rufe jetzt diese Methode auf
[self moveToPage];
Ich hoffe, es funktioniert :)
quelle
Für eine einzelne Seite habe ich gerade die Antwort von @Jack Humphries bearbeitet
quelle
Wie @samwize hervorhob, erfolgt die Paginierung mithilfe von
So habe ich es gemacht: Ich habe meine Datenquelle und den Delegaten getrennt. Sie können diese Methode aufrufen und nur die "nächste" Ansicht ändern. Zuvor müssen Sie die Paging-Regeln anwenden. Das heißt, Sie müssen die Richtung und den nächsten Controller überprüfen. Wenn Sie diese Methode mit Ihrer benutzerdefinierten Datenquelle verwenden, ändert sich das angezeigte Array von Controllern nicht (da Sie ein benutzerdefiniertes Array für eine NSObject-Unterklasse verwenden).
Mit Ihrer eigenen Datenquelle legt die Methode nur eine neue Ansicht fest (mit einer bestimmten Richtung). Da steuern Sie weiterhin die Seiten, die beim normalen Wischen angezeigt werden.
quelle
Ich arbeite seit gestern daran und ich habe es endlich geschafft. Ich konnte die Standardvorlage nicht vollständig verwenden, da ich drei verschiedene viewController als untergeordnete Ansichten habe:
Ich brauchte nur in der ersten VC eine Auslösetaste, also habe ich eine Eigenschaft für pageViewController und model hinzugefügt:
Ich habe die Init-Methode des Modells neu geschrieben, um Storyboard und pageViewController als Parameter zu übergeben, damit ich diese auf meine VC1 setzen kann:
Schließlich habe ich in meinem ein IBAction VC1 den pageViewController Verfahren zu triggern setViewControllers: Richtung: animierte: Fertigstellung: :
Hinweis: Ich muss keine VCs-Indizes finden. Meine Schaltfläche führt mich zu meiner zweiten VC. Es ist jedoch nicht schwierig, alle Indizes abzurufen und Ihre untergeordneten Ansichten zu verfolgen:
Ich hoffe es hilft dir!
quelle
Hier ist eine Lösung mit UIPageViewControllerDataSource- Methoden:
Der Code verfolgt den aktuell angezeigten View Controller im UIPageViewController .
Initialisieren Sie zuerst currentViewController mit dem für den UIPageViewController festgelegten anfänglichen Ansichtscontroller .
Verfolgen Sie dann den aktuellen ViewController in den UIPageViewControllerDelegate- Methoden: pageViewController: willTransitionToViewControllers: und pageViewController: didFinishAnimating: previousViewControllers: TransitionCompleted : .
Schließlich wird in dem Verfahren Ihrer Wahl (im Beispiel unten ist es - (IBAction) OnNext: (id) sender ) können Sie programmatisch wechseln zum nächsten oder vorherigen Controller UIPageViewControllerDataSouce Methoden pageViewController: viewControllerBeforeViewController: , pageViewController: viewControllerAfterViewController: zu erhalten den nächsten oder vorherigen View-Controller und navigieren Sie zu ihm, indem Sie [self.pageViewController setViewControllers: @ [vc] aufrufen: Richtung: UIPageViewControllerNavigationDirectionForward animiert: YES-Abschluss: nil];
quelle
Da die ViewController in den PageViewController eingebettet sind, müssen Sie lediglich Folgendes tun:
Beispiel in Xamarin, aber funktional ähnlich wie Swift usw. Der folgende Code befindet sich in Button Click-Delegat in einem der ViewController, die als Seite angezeigt werden:
quelle