Woher wissen Sie, welche aktuelle Seite / Ansicht in einem angezeigt wird UIPageViewController
?
Ich habe die viewDidAppear
Methode meiner untergeordneten Ansichten überschrieben , sodass sie in ihrer viewDidAppear
Methode eine ID an die übergeordnete Ansicht senden .
Das Problem ist jedoch folgendes: Ich kann diese ID nicht zuverlässig als ID für die angezeigte Seite verwenden. Denn wenn der Benutzer die Seite umblättert, aber nach der Hälfte der Zeit beschließt, das Umblättern zu stoppen und die Seite zurückzusetzen, wurde viewDidAppear
dies bereits aufgerufen. (Die Ansicht ist hinter der gekräuselten Seite sichtbar).
Vielleicht sollte ich nur zu einer neuen ID wechseln, wenn die aktuelle Ansicht verschwindet. Aber ich frage mich, ob es keinen einfacheren Weg gibt, die aktuell sichtbare Ansicht zurückzugeben.
viewDidAppear:animated:
stattdessen zu verwenden?Antworten:
Sie sollten die aktuelle Seite manuell verfolgen. Die Delegate-Methode
pageViewController:didFinishAnimating:previousViewControllers:transitionCompleted:
teilt Ihnen mit, wann diese Variable aktualisiert werden muss. Das letzte Argument der MethodetransitionCompleted:
kann Ihnen sagen, ob ein Benutzer einen Seitenwechsel abgeschlossen hat oder nicht.quelle
Ab iOS 6 habe ich festgestellt, dass die
viewControllers
Eigenschaft von UIPageViewController ständig aktualisiert wird, sodass immer der eine Ansichtscontroller enthalten ist, der die aktuelle Seite darstellt, und sonst nichts. Auf diese Weise können Sie auf die aktuelle Seite zugreifen, indem Sie anrufenviewControllers[0]
(vorausgesetzt, Sie zeigen jeweils nur einen Ansichts-Controller an).Das viewController-Array wird erst aktualisiert, wenn die Seite "eingerastet" ist. Wenn ein Benutzer die nächste Seite teilweise anzeigt, wird sie erst dann zur "aktuellen" Seite, wenn er den Übergang abgeschlossen hat.
Wenn Sie die "Seitenzahlen" verfolgen möchten, weisen Sie Ihren Ansichtscontrollern einen Indexwert zu, wenn Sie sie über die UIPageViewController-Datenquellenmethoden erstellen.
Also zum Beispiel:
Aber beachten Sie die Kommentare , dass diese unzuverlässig ist.
quelle
viewControllers
Eigenschaft zu und erhalte die richtigen Ansichts-Controller. Wenn ich jedoch die Methode drehe,spineLocationForInterfaceOrientation
erhalte ich nicht mehr die richtigen Ansichts-Controller. Also habe ich mich daran gehalten, meine eigene currentPage-Eigenschaft beizubehalten, anstatt mich immer auf die zu verlassenviewControllers
.Leider haben mir alle oben genannten Methoden nicht geholfen. Trotzdem habe ich die Lösung mithilfe von Tags gefunden. Vielleicht ist es nicht das Beste, aber es funktioniert und ich hoffe, es hilft jemandem:
In Swift: (danke an @Jessy )
Beispiel: Kern
quelle
Aufbauend auf Oles Antwort…
So habe ich die 4 Methoden implementiert, um die aktuelle Seite zu verfolgen und den Seitenindikator auf den richtigen Index zu aktualisieren:
quelle
self.nextIndex = self.currentIndex
eher sein alsself.nextIndex = 0
, um den Index richtig wiederherzustellen, wenn ein Übergang nicht abgeschlossen ist. Andernfalls besteht die Gefahr, dass Sie dencurrentIndex
Wert 0 erhalten, wenn Sie irgendwo in der Mitte Ihrer Seiten schnell hin und her blättern.Die folgende Lösung hat bei mir funktioniert.
Apple könnte viel Ärger vermeiden, indem die native UIPageViewController-Paginierung der Bildlaufansicht konfigurierbarer gemacht wird. Ich musste auf das Überlagern eines neuen UIView und UIPageControl zurückgreifen, nur weil die native UIPageViewController-Paginierung keinen transparenten Hintergrund oder keine Neupositionierung innerhalb des Ansichtsrahmens unterstützt.
quelle
Swift 4
Kein unnötiger Code. 3 Möglichkeiten es zu tun. Verwenden der UIPageViewControllerDelegate- Methode.
quelle
pageViewController.viewControllers
. Woher kennen Sie viewController? .Erste ist die fragliche?Ich verfolge den Seitenindex, indem ich eine kleine Funktion verwende und pageIndex als statische NSInteger spezifiziere.
und Aufrufen
[self setPageIndex];
innerhalb der von Ole angegebenen Funktion und auch nach Erkennen der Änderung der Ausrichtung.quelle
Ich habe zuerst die Corey-Lösung verwendet, aber sie funktionierte nicht unter iOS5.
Es wurde versucht, durch verschiedene Seiten zu blättern, und es funktioniert vorerst gut.
quelle
Leider funktioniert nichts oben für mich.
Ich habe zwei Ansichts-Controller und wenn ich die letzte Ansicht leicht (ca. 20 Pixel) rückwärts scrolle, wird der Delegat ausgelöst:
pageViewController:didFinishAnimating:previousViewControllers:transitionCompleted:
und zu sagen, dass die aktuelle Seite (Index)
0
falsch ist.Verwenden von delegate in child viewController wie folgt:
das wird im Inneren ausgelöst
viewDidAppear
wie:Hat für mich gearbeitet.
quelle
Das funktioniert bei mir zuverlässig
Ich habe einen benutzerdefinierten UIPageController. Diese pageController.currentPage wird vom angezeigten UIViewController in der viewWillAppear aktualisiert
quelle
Ich benutze es schon
view.tag
eine Weile und es war zu kompliziert, den Überblick über die aktuelle Seite zu behalten.In diesem Code wird der Index im gespeichert
tag
Eigenschaft von jedemview
und zum Abrufen der nächsten oder vorherigen VC verwendet. Mit dieser Methode ist es auch möglich, eine unendliche Schriftrolle zu erstellen. Schauen Sie sich den Kommentar im Code an, um auch diese Lösung anzuzeigen:quelle
Vielen Dank für Ihre Antwort Jungs, ich hatte ein ähnliches Problem, musste Index speichern. Ich ändere meinen Code leicht und füge ihn unten ein:
quelle
Wie wäre es, wenn Sie
viewController
direkt bei derUIPageViewController
(Swift 4-Version) nach einem fragen :Wenn Sie zu einem bestimmten Zeitpunkt nur den aktuell angezeigten Ansichts-Controller benötigen, verwenden Sie ihn einfach
pageViewController.viewControllers?.first
zu diesem Zeitpunkt.quelle
quelle
Der folgende Demo-Code (in Swift 2) zeigt, wie dies durch die Implementierung eines einfachen Image Swiper-Tutorials erreicht wird. Kommentare im Code selbst:
quelle
Ich habe ein viewControllers-Array, das ich im UIPageViewController anzeige .
Wichtig hierbei ist, dass die setViewControllers- Methode von UIPageViewController keinen Delegatenrückruf gibt. Die delegierten Rückrufe repräsentieren nur Benutzerberührungsaktionen im UIPageViewController .
quelle
Dies ist die Lösung, die ich mir ausgedacht habe:
Verwendung:
Stellen Sie sicher, dass Sie den Anfangstitel festlegen
quelle
Der einfachste Weg, sich diesem IMHO zu nähern, besteht darin, das PageControl zu verwenden, um das potenzielle Ergebnis des Übergangs zu speichern und dann zurückzusetzen, wenn der Übergang abgebrochen wurde. Dies bedeutet, dass sich die Seitensteuerung ändert, sobald der Benutzer mit dem Wischen beginnt, was für mich in Ordnung ist. Dies setzt voraus, dass Sie über ein eigenes Array von UIViewControllern verfügen (in diesem Beispiel als
allViewControllers
)quelle
Verfolgen Sie unsere aktuelle Seitenzahl in den Delegatenmethoden:
Wir verwenden einen Helfer getVC, um unsere Seitenzahl zu aktualisieren und die nächste / vorherige vc zurückzugeben. Dies ist ein guter Ort, um dies zu tun, da getVC nur aufgerufen wird, wenn es eine nächste oder vorherige VC gibt.
quelle
In schnellen 5 und folgenden Sirvine Antwort
In diesem Fall ist es mir egal, welche Klasse von UIViewController eingebettet ist
quelle
Es wird der aktuelle Seitenindex zurückgegeben. und muss diesen Code unter der Delegatenfunktion von UIPageViewController (didFinishAnimating) verwenden.
quelle