NavigationController verfügen über zu verwaltende ViewController-Stapel und begrenzte Animationsübergänge.
Das Hinzufügen eines View-Controllers als Unteransicht zu einem vorhandenen View-Controller erfordert das Übergeben von Ereignissen an den Sub-View-Controller. Dies ist mühsam zu verwalten, mit wenig Ärger verbunden und fühlt sich bei der Implementierung im Allgemeinen wie ein schlechter Hack an (Apple rät ebenfalls davon ab Dies tun).
Durch erneutes Präsentieren eines modalen Ansichts-Controllers wird ein Ansichts-Controller über einen anderen gelegt, und obwohl die oben beschriebenen Probleme beim Übergeben von Ereignissen nicht auftreten, wird der Ansichts-Controller nicht wirklich "ausgetauscht", sondern gestapelt.
Storyboards sind auf iOS 5 beschränkt und nahezu ideal, können jedoch nicht in allen Projekten verwendet werden.
Kann jemand ein SOLID CODE-BEISPIEL für eine Möglichkeit zum Ändern von Ansichts-Controllern ohne die oben genannten Einschränkungen vorlegen und animierte Übergänge zwischen ihnen zulassen?
Ein genaues Beispiel, aber keine Animation: So verwenden Sie mehrere benutzerdefinierte iOS-Ansichtscontroller ohne Navigationscontroller
Bearbeiten: Die Verwendung des Nav-Controllers ist in Ordnung, es müssen jedoch animierte Übergangsstile vorhanden sein (nicht nur die Folieneffekte). Der angezeigte View-Controller muss vollständig ausgetauscht (nicht gestapelt) werden. Wenn der zweite Ansichtscontroller einen anderen Ansichtscontroller vom Stapel entfernen muss, ist er nicht ausreichend gekapselt.
Edit 2: iOS 4 sollte das Basisbetriebssystem für diese Frage sein, das hätte ich bei der Erwähnung von Storyboards (oben) klarstellen müssen.
quelle
Antworten:
BEARBEITEN: Neue Antwort, die in jeder Ausrichtung funktioniert. Die ursprüngliche Antwort funktioniert nur, wenn sich die Benutzeroberfläche im Hochformat befindet. Hierbei handelt es sich um b / c-Ansichtsübergangsanimationen, die eine Ansicht mit einer anderen Ansicht ersetzen. Die Ansichten müssen mindestens eine Ebene unter der ersten zum Fenster hinzugefügten Ansicht liegen (z
window.rootViewController.view.anotherView
.B.).Ich habe eine einfache Containerklasse implementiert, die ich aufgerufen habe
TransitionController
. Sie finden es unter https://gist.github.com/1394947 .Abgesehen davon bevorzuge ich die Implementierung in einer separaten Klasse b / c, die einfacher wiederzuverwenden ist. Wenn Sie das nicht möchten, können Sie dieselbe Logik einfach direkt in Ihrem App-Delegaten implementieren, ohne dass die
TransitionController
Klasse erforderlich ist . Die Logik, die Sie benötigen würden, wäre jedoch dieselbe.Verwenden Sie es wie folgt:
In Ihrem App-Delegaten
So wechseln Sie von einem beliebigen Ansichtscontroller zu einem neuen Ansichtscontroller
BEARBEITEN: Originalantwort unten - funktioniert nur zur Portait-Orientierung
Für dieses Beispiel habe ich folgende Annahmen getroffen:
Sie haben einen View Controller als den
rootViewController
Ihres Fensters zugewiesenWenn Sie zu einer neuen Ansicht wechseln, möchten Sie den aktuellen viewController durch den viewController ersetzen, der die neue Ansicht besitzt. Zu jedem Zeitpunkt ist nur der aktuelle viewController aktiv (z. B. zugewiesen).
Der Code kann leicht geändert werden, um anders zu funktionieren. Der entscheidende Punkt ist der animierte Übergang und der Single View Controller. Stellen Sie sicher, dass Sie einen Ansichts-Controller nur außerhalb der Zuweisung behalten
window.rootViewController
.Code zum Animieren des Übergangs im App-Delegaten
Beispiel für die Verwendung in einem View Controller
quelle
TransitionController.m
inUIView *view = [[UIView alloc] initWithFrame:[UIScreen mainScreen].bounds];
geändert habe, aber ich habe dies nur für die neueste Version von iOS verwendet. Testen Sie es daher sorgfältig.Sie können das neue viewController-Containment-System von Apple verwenden. Weitere Informationen finden Sie im WWDC 2011-Sitzungsvideo "Implementing
UIViewController
Containment".UIViewController
Containment ist neu in iOS5 und ermöglicht es Ihnen, einen übergeordneten viewController und eine Reihe von untergeordneten viewControllern zu haben, die darin enthalten sind. So funktioniert der UISplitViewController. Auf diese Weise können Sie Ansichtscontroller in einem übergeordneten Element stapeln. Für Ihre spezielle Anwendung verwenden Sie jedoch nur das übergeordnete Element, um den Übergang von einem sichtbaren viewController zu einem anderen zu verwalten. Dies ist die von Apple genehmigte Methode, um Dinge zu tun, und das Animieren von einem untergeordneten ViewController ist schmerzlos. Außerdem können Sie die verschiedenenUIViewAnimationOption
Übergänge nutzen!Mit UIViewContainment müssen Sie sich auch keine Sorgen über die Unordnung bei der Verwaltung der untergeordneten viewController während Orientierungsereignissen machen, es sei denn, Sie möchten. Sie können einfach Folgendes verwenden, um sicherzustellen, dass Ihr parentViewController Rotationsereignisse an die untergeordneten viewController weiterleitet.
In der viewDidLoad-Methode Ihrer Eltern können Sie Folgendes oder ähnliches tun, um den ersten childViewController einzurichten:
Wenn Sie dann den untergeordneten viewController ändern müssen, rufen Sie im übergeordneten viewController Folgendes auf:
Ich habe hier ein vollständiges Beispielprojekt veröffentlicht: https://github.com/toolmanGitHub/stackedViewControllers . Dieses andere Projekt zeigt, wie
UIViewController
Containment für verschiedene Eingabeansichts-Controllertypen verwendet wird, die nicht den gesamten Bildschirm einnehmen. Viel Glückquelle
[self.currentViewController willMoveToParentViewController:nil];
vor dem Übergang anrufen ?OK, ich weiß, dass die Frage ohne Verwendung eines Navigationscontrollers lautet, aber kein Grund, dies nicht zu tun. OP reagierte nicht rechtzeitig auf Kommentare, damit ich schlafen gehen konnte. Wählt mich nicht ab. :) :)
So öffnen Sie den aktuellen Ansichts-Controller und wechseln mithilfe eines Navigations-Controllers zu einem neuen Ansichts-Controller:
quelle
Da ich gerade auf dieses genaue Problem gestoßen bin und Variationen aller bereits vorhandenen Antworten auf begrenzten Erfolg ausprobiert habe, werde ich veröffentlichen, wie ich es letztendlich gelöst habe:
Wie in diesem Beitrag zu benutzerdefinierten Segmenten beschrieben , ist es eigentlich ganz einfach, benutzerdefinierte Segmente zu erstellen. Sie lassen sich auch sehr einfach in Interface Builder einbinden, halten Beziehungen in IB sichtbar und erfordern nicht viel Unterstützung durch die Quell- / Zielansichts-Controller des Segues.
Der oben verlinkte Beitrag enthält iOS 4-Code, um den aktuellen Controller für die Draufsicht auf dem Navigationscontroller-Stapel durch einen neuen zu ersetzen, der eine Animation zum Einschieben von oben verwendet.
In meinem Fall wollte ich, dass ein ähnlicher Ersatz-
FlipFromLeft
Übergang stattfindet , jedoch mit einem Übergang. Ich brauchte auch nur Unterstützung für iOS 5+. Code:Von RAFlipReplaceSegue.h:
Von RAFlipReplaceSegue.m:
Ziehen Sie nun bei gedrückter Ctrl-Taste, um eine andere Art von Segue einzurichten, machen Sie es dann zu einem benutzerdefinierten Segue und geben Sie den Namen der benutzerdefinierten Segue-Klasse ein, et voilà!
quelle
–performSegueWithIdentifier:sender:
Methode können Sie einen Segue in Code aufrufen .Ich hatte lange mit diesem Problem zu kämpfen, und eines meiner Probleme ist hier aufgeführt . Ich bin mir nicht sicher, ob Sie dieses Problem hatten. Aber hier ist, was ich empfehlen würde, wenn es mit iOS 4 funktionieren muss.
Erstellen Sie zunächst eine neue
NavigationController
Klasse. Hier erledigen wir die ganze Drecksarbeit - andere Klassen können Instanzmethoden wiepushViewController:
und so "sauber" aufrufen . In Ihrem.h
:Das Array der untergeordneten Ansichtscontroller dient als Speicher für alle Ansichtscontroller in unserem Stapel. Wir würden den gesamten Rotations- und Größenänderungscode automatisch aus der
NavigationController
Sicht von an weiterleitencurrentController
.Nun zu unserer Implementierung:
Jetzt können Sie Ihre eigenen implementieren
pushViewController:
,popViewController
und solche, diese Methodenaufrufe.Viel Glück und ich hoffe das hilft!
quelle
viewWillAppear
sollteviewDidAppear
, und so weiter.Versuchen Sie diesen Code.
Dieser Code gibt den Übergang von einem Ansichtscontroller zu einem anderen Ansichtscontroller mit einem Navigationscontroller.
quelle