Ich habe eine navigationsbasierte Anwendung und möchte die Animation der Push- und Pop-Animationen ändern. Wie würde ich das machen?
Bearbeiten Sie 2018
Es gab viele Antworten auf diese Frage und es ist schon eine ganze Weile her. Ich habe die Antwort auf das, was ich jetzt für die relevanteste halte, neu gewählt. Wenn es jemanden gibt, der anders denkt, lass es mich bitte in den Kommentaren wissen
Antworten:
Für 2019 die "endgültige Antwort!"
Präambel:
Angenommen, Sie sind neu in der iOS-Entwicklung. Verwirrenderweise bietet Apple zwei Übergänge, die leicht verwendet werden können. Dies sind: "Crossfade" und "Flip".
Aber natürlich sind "Crossfade" und "Flip" nutzlos. Sie werden nie benutzt. Niemand weiß, warum Apple diese beiden nutzlosen Übergänge bereitgestellt hat!
So:
Angenommen, Sie möchten einen gewöhnlichen, allgemeinen Übergang wie "Folie" ausführen. In diesem Fall müssen Sie eine RIESIGE Menge Arbeit erledigen! .
Diese Arbeit wird in diesem Beitrag erklärt.
Nur um es zu wiederholen:
Überraschenderweise: Wenn Sie mit iOS die einfachsten, häufigsten alltäglichen Übergänge (z. B. eine normale Folie) wünschen , müssen Sie die gesamte Arbeit der Implementierung eines vollständigen benutzerdefinierten Übergangs erledigen .
So geht's ...
1. Sie benötigen eine benutzerdefinierte
UIViewControllerAnimatedTransitioning
Du brauchst einen eigenen Bool
popStyle
. (Knallt es auf oder ab?)Sie müssen
transitionDuration
(trivial) und den Hauptaufruf einschließen ,animateTransition
Tatsächlich müssen Sie zwei verschiedene Routinen für inside schreiben
animateTransition
. Eine für den Push und eine für den Pop. Nennen Sie sie wahrscheinlichanimatePush
undanimatePop
. Im InnerenanimateTransition
verzweigen Sie einfachpopStyle
zu den beiden RoutinenDas folgende Beispiel führt einen einfachen Um- / Abzug durch
In Ihren
animatePush
undanimatePop
Routinen. Sie müssen das "from view" und das "to view" erhalten. (Wie das geht, erfahren Sie im Codebeispiel.)und Sie müssen
addSubview
für die neue "to" -Ansicht.und du musst
completeTransition
am Ende deines Anime anrufenSo ..
Und dann ...
2. Verwenden Sie es in Ihrem View Controller.
Hinweis: Seltsamerweise müssen Sie dies nur im "ersten" Ansichts-Controller tun . (Der, der "darunter" ist.)
Mit dem, den Sie oben platzieren , tun Sie nichts . Einfach.
Also deine Klasse ...
wird...
Das ist es.
Push and Pop genau wie gewohnt, keine Änderung. Drücken ...
und um es zu öffnen, können Sie dies auf dem nächsten Bildschirm tun, wenn Sie möchten:
Puh.
3. Genießen Sie auch die anderen Antworten auf dieser Seite, in denen erläutert wird, wie AnimatedTransitioning überschrieben wird
Scrollen Sie zu @AlanZeino und antworten Sie auf @elias, um weitere Informationen darüber zu erhalten, wie Sie heutzutage
AnimatedTransitioning
in iOS-Apps vorgehen können !quelle
animatePush
undanimatePop
sind .. die zwei verschiedenen Richtungen!Ich habe folgendes getan und es funktioniert gut .. und ist einfach und leicht zu verstehen ..
Und das gleiche für Push ..
Swift 3.0 Version:
quelle
Animated:NO
Teil ist wichtig. WennYES
bestanden, mischen sich die Animationen und verursachen lustige Effekte.setViewControllers:
So habe ich es immer geschafft, diese Aufgabe zu erledigen.
Für Push:
Für Pop:
Ich bekomme immer noch viel Feedback, daher werde ich es aktualisieren, um Animationsblöcke zu verwenden. Dies ist die von Apple empfohlene Methode, um Animationen zu erstellen.
Für Push:
Für Pop:
quelle
super
durchself.navigationController
UIViewController
einen Namen ohne "ViewController" -Teil zu unterklassifizieren? Dieser Name ist besser für UIView geeignet.zum schieben
für Pop
quelle
@ Magnus Antwort, nur dann für Swift (2.0)
Einige Nebenbemerkungen:
Sie können dies auch mit Segue tun. Implementieren Sie dies einfach in
prepareForSegue
odershouldPerformSegueWithIdentifier
. Dadurch bleibt jedoch auch die Standardanimation erhalten. Um dies zu beheben, müssen Sie zum Storyboard gehen, auf Segue klicken und das Kontrollkästchen 'Animates' deaktivieren. Dies wird jedoch Ihre App für IOS 9.0 und höher einschränken (zumindest als ich es in Xcode 7 getan habe).Wenn Sie in einem Segue arbeiten, sollten die letzten beiden Zeilen ersetzt werden durch:
Obwohl ich falsch gesetzt habe, ignoriert es es irgendwie.
quelle
Denken Sie daran , dass in Swift , Erweiterung sind auf jeden Fall Ihre Freunde!
quelle
Die Verwendung privater Anrufe ist eine schlechte Idee, da Apple Apps, die dies tun, nicht mehr genehmigt. Vielleicht könnten Sie das versuchen:
quelle
-pushViewController:transition:forceImmediate:
die Verwendung, was eine schlechte Idee wäre.Da dies das Top-Ergebnis bei Google ist, dachte ich, ich würde mitteilen, was meiner Meinung nach der vernünftigste Weg ist. Dies ist die Verwendung der iOS 7+ -Übergangs-API. Ich habe dies für iOS 10 mit Swift 3 implementiert.
Es ist ziemlich einfach, dies mit der
UINavigationController
Animation zwischen zwei Ansichts-Controllern zu kombinieren, wenn Sie eine UnterklasseUINavigationController
einer Klasse erstellen und eine Instanz einer Klasse zurückgeben, die demUIViewControllerAnimatedTransitioning
Protokoll entspricht.Zum Beispiel ist hier meine
UINavigationController
Unterklasse:Sie können sehen, dass ich das
UINavigationControllerDelegate
auf sich selbst setze , und in einer Erweiterung in meiner Unterklasse implementiere ich die MethodeUINavigationControllerDelegate
, mit der Sie einen benutzerdefinierten Animationscontroller (dhNavigationControllerAnimation
) zurückgeben können. Dieser benutzerdefinierte Animationscontroller ersetzt die Standardanimation für Sie.Sie fragen sich wahrscheinlich, warum ich die Operation
NavigationControllerAnimation
über ihren Initialisierer an die Instanz übergebe. Ich mache das so, dass ich beiNavigationControllerAnimation
der Implementierung desUIViewControllerAnimatedTransitioning
Protokolls weiß, was die Operation ist (dh 'Push' oder 'Pop'). Dies hilft zu wissen, welche Art von Animation ich machen soll. Meistens möchten Sie je nach Vorgang eine andere Animation ausführen.Der Rest ist ziemlich normal. Implementieren Sie die beiden erforderlichen Funktionen im
UIViewControllerAnimatedTransitioning
Protokoll und animieren Sie, wie Sie möchten:Es ist wichtig zu bedenken, dass für jede Art von Operation (dh 'Push' oder 'Pop') die Zu- und Ab-Controller unterschiedlich sind. Wenn Sie sich in einer Push-Operation befinden, wird der Controller für die Anzeige angezeigt. Wenn Sie sich in einem Pop-Vorgang befinden, wird der Controller für die Ansicht angezeigt, auf den umgestellt wird, und der Controller für die Ansicht wird angezeigt.
Außerdem muss der
to
Ansichts-Controller als Unteransicht descontainerView
im Übergangskontext hinzugefügt werden .Wenn Ihre Animation abgeschlossen ist, müssen Sie anrufen
transitionContext.completeTransition(true)
. Wenn Sie einen interaktiven Übergang tun, müssen Sie dynamisch eine RückkehrBool
zucompleteTransition(didComplete: Bool)
, je nachdem , ob der Übergang am Ende der Animation abgeschlossen ist.Schließlich ( optionales Lesen ) möchten Sie vielleicht sehen, wie ich den Übergang gemacht habe, an dem ich gearbeitet habe. Dieser Code ist etwas hackiger und ich habe ihn ziemlich schnell geschrieben, daher würde ich nicht sagen, dass er großartiger Animationscode ist, aber er zeigt immer noch, wie man den Animationsteil macht.
Meins war ein wirklich einfacher Übergang; Ich wollte dieselbe Animation nachahmen, die UINavigationController normalerweise ausführt, aber anstelle der Animation "Nächste Seite über dem oberen Rand" wollte ich gleichzeitig mit der neuen Ansicht eine 1: 1-Animation des alten Ansichts-Controllers implementieren Controller erscheint. Dies hat den Effekt, dass die beiden Ansichts-Controller so aussehen, als wären sie miteinander verbunden.
Für den Push-Vorgang muss zuerst der
toViewController
Ansichtsursprung der Ansicht auf der x-Achse außerhalb des Bildschirms festgelegt, als Unteransicht der hinzugefügtcontainerView
und auf dem Bildschirm animiert werden , indem dieser Wertorigin.x
auf Null gesetzt wird. Gleichzeitig animiere ich diefromViewController
Ansichtorigin.x
des Bildschirms, indem ich sie vom Bildschirm aus deaktiviere:Die Pop-Operation ist im Grunde die Umkehrung. Fügen Sie das
toViewController
als Unteransicht des hinzucontainerView
und animierenfromViewController
Sie das rechts weg , während Sie dastoViewController
von links animieren :Hier ist ein Kern der gesamten schnellen Datei:
https://gist.github.com/alanzeino/603293f9da5cd0b7f6b60dc20bc766be
quelle
Es gibt UINavigationControllerDelegate und UIViewControllerAnimatedTransitioning. Dort können Sie die Animation für alles ändern, was Sie wollen.
Dies ist beispielsweise eine vertikale Pop-Animation für VC:
}}
Und dann
Nützliches Tutorial https://www.objc.io/issues/5-ios7/view-controller-transitions/
quelle
Basierend auf der für schnell aktualisierten Antwort 4
jordanperry
Zum schieben
UIViewController
Für Pop
quelle
So habe ich es in Swift gemacht:
Für Push:
Für Pop:
Ich habe dies tatsächlich ein wenig anders gemacht als einige der obigen Antworten - aber da ich neu in der Swift-Entwicklung bin, ist es möglicherweise nicht richtig. Ich habe
viewWillDisappear:animated:
den Pop-Code dort überschrieben und hinzugefügt:quelle
@ Luca Davanzos Antwort in Swift 4.2
quelle
Ich habe kürzlich versucht, etwas Ähnliches zu tun. Ich entschied, dass mir die gleitende Animation des UINavigationControllers nicht gefallen hat, aber ich wollte auch nicht die Animationen machen, die UIView Ihnen wie Curl oder ähnliches gibt. Ich wollte eine Überblendung zwischen den Ansichten machen, wenn ich drücke oder knalle.
Das Problem besteht darin, dass die Ansicht die Ansicht buchstäblich entfernt oder über die aktuelle Ansicht legt, sodass eine Überblendung nicht funktioniert. Die Lösung bestand darin, meine neue Ansicht als Unteransicht zur aktuellen Draufsicht auf dem Stapel des UIViewControllers hinzuzufügen. Ich füge es mit einem Alpha von 0 hinzu und mache dann eine Überblendung. Wenn die Animationssequenz beendet ist, schiebe ich die Ansicht auf den Stapel, ohne sie zu animieren. Ich gehe dann zurück zum alten topView und räume Sachen auf, die ich geändert habe.
Es ist etwas komplizierter, da Sie die Navigationselemente haben, die Sie anpassen müssen, damit der Übergang korrekt aussieht. Wenn Sie eine Drehung durchführen, müssen Sie die Rahmengrößen anpassen, während Sie die Ansichten als Unteransichten hinzufügen, damit sie korrekt auf dem Bildschirm angezeigt werden. Hier ist ein Teil des Codes, den ich verwendet habe. Ich habe den UINavigationController unterklassifiziert und die Push- und Pop-Methoden überschrieben.
Wie ich im Code erwähne, habe ich immer ein Element in der linken Leiste, daher überprüfe ich nicht, ob es Null ist, bevor ich es in das Array einfüge, das ich als Kontext für den Animationsdelegierten übergebe. Wenn Sie dies tun, möchten Sie möglicherweise diese Überprüfung durchführen.
Das Problem, das ich gefunden habe, war, dass das Programm nicht abstürzt, wenn Sie in der Delegate-Methode überhaupt abstürzen. Es verhindert nur, dass der Delegat fertig ist, aber Sie erhalten keinerlei Warnung.
Da ich meine Bereinigung in dieser Delegatenroutine durchführte, verursachte dies ein seltsames visuelles Verhalten, da die Bereinigung nicht abgeschlossen wurde.
Die von mir erstellte Zurück-Schaltfläche ruft eine "goBack" -Methode auf, und diese Methode ruft nur die Pop-Routine auf.
Auch hier ist meine Pop-Routine.
Das wars so ziemlich. Sie benötigen zusätzlichen Code, wenn Sie Rotationen implementieren möchten. Sie müssen die Rahmengröße Ihrer Ansichten festlegen, die Sie als Unteransichten hinzufügen, bevor Sie sie anzeigen. Andernfalls treten Probleme auf. Die Ausrichtung ist Querformat, aber das letzte Mal, als Sie die vorherige Ansicht gesehen haben, war es Hochformat. Dann fügen Sie es als Unteransicht hinzu und blenden es ein, aber es wird als Hochformat angezeigt. Wenn wir dann ohne Animation einblenden, ist dieselbe Ansicht, aber die im Stapel befindliche, jetzt Querformat. Das Ganze sieht ein bisschen funky aus. Die Implementierung von Rotation bei jedem ist etwas anders, daher habe ich meinen Code dafür hier nicht angegeben.
Hoffe es hilft einigen Leuten. Ich habe überall nach so etwas gesucht und konnte nichts finden. Ich denke nicht, dass dies die perfekte Antwort ist, aber es funktioniert zu diesem Zeitpunkt wirklich gut für mich.
quelle
Sie können jetzt verwenden
UIView.transition
. Beachten Sie dasanimated:false
. Dies funktioniert mit jeder Übergangsoption, Pop, Push oder Stack-Ersetzung.quelle
Erstellen Sie anhand der Antwort von iJordan einfach eine Kategorie auf UINavigationController, die Sie in Ihrer gesamten App verwenden können, anstatt diesen Animationscode überall zu kopieren / einzufügen.
UINavigationController + Animation.h
UINavigationController + Animation.m
Importieren Sie dann einfach die Datei UINavigationController + Animation.h und rufen Sie sie normal auf:
quelle
Es ist sehr einfach
quelle
Schauen Sie sich ADTransitionController an , einen Ersatz für UINavigationController mit benutzerdefinierten Übergangsanimationen (seine API entspricht der API von UINavigationController), die wir bei Applidium erstellt haben.
Sie können verschiedene vordefinierte Animationen für Push- und Pop- Aktionen wie Wischen , Überblenden , Würfeln , Karussell , Zoomen usw. verwenden.
quelle
Während alle Antworten hier großartig sind und die meisten sehr gut funktionieren, gibt es eine etwas einfachere Methode, die den gleichen Effekt erzielt ...
Für Push:
Für Pop:
quelle
Mir ist nicht bekannt, wie Sie die Übergangsanimation öffentlich ändern können.
Wenn die Schaltfläche „Zurück“ nicht notwendig ist , Sie sollten verwenden modal View - Controller die „Push von unten“ haben / „Flip“ / „faden“ / (≥3.2) „Einrollen“ Übergänge.
Auf der privaten Seite
-pushViewController:animated:
ruft die Methode die undokumentierte Methode auf-pushViewController:transition:forceImmediate:
. Wenn Sie also beispielsweise einen Übergang von links nach rechts wünschen, können Sie diese verwendenSie können den "Pop" -Übergang jedoch nicht auf diese Weise ändern.
quelle
In meiner Antwort auf diese Frage finden Sie eine Möglichkeit, dies in weitaus weniger Codezeilen zu tun. Mit dieser Methode können Sie einen Pseudo- "Push" eines neuen Ansichts-Controllers nach Belieben animieren. Wenn die Animation abgeschlossen ist, wird der Navigations-Controller so eingerichtet, als hätten Sie die Standard-Push-Methode verwendet. In meinem Beispiel können Sie entweder ein Slide-In von links oder von rechts animieren. Der Code wird hier zur Vereinfachung wiederholt:
quelle
Schauen Sie sich diese Variante in der Beispiel-App an. https://github.com/mpospese/MPFoldTransition/
quelle
Benutz einfach:
quelle
Dies zu erkennen ist eine alte Frage. Ich möchte diese Antwort immer noch posten, da ich einige Probleme hatte, einige
viewControllers
mit den vorgeschlagenen Antworten zu knallen . Meine Lösung besteht darin,UINavigationController
alle Pop- und Push-Methoden zu unterklassifizieren und zu überschreiben.FlippingNavigationController.h
FlippingNavigationController.m:
quelle
Ich weiß, dass dieser Thread alt ist, aber ich dachte, ich würde meine zwei Cent einbringen. Sie müssen keine benutzerdefinierte Animation erstellen, es gibt eine einfache (möglicherweise hackige) Möglichkeit, dies zu tun. Erstellen Sie anstelle von Push einen neuen Navigationscontroller, machen Sie den neuen Ansichtscontroller zum Stammansichtscontroller dieses Navigationscontrollers und präsentieren Sie dann den Navigationscontroller vom ursprünglichen Navigationscontroller. Present ist mit vielen Stilen leicht anpassbar und es ist nicht erforderlich, eine benutzerdefinierte Animation zu erstellen.
Beispielsweise:
Sie können den Präsentationsstil beliebig ändern.
quelle
Ich habe einen leicht rekursiven Weg gefunden, der für meine Zwecke funktioniert. Ich habe eine Instanzvariable BOOL, mit der ich die normale Popping-Animation blockiere und meine eigene nicht animierte Pop-Nachricht ersetze. Die Variable wird anfänglich auf NO gesetzt. Wenn Sie auf die Schaltfläche "Zurück" tippen, setzt die Delegatmethode sie auf "JA" und sendet eine neue nicht animierte Popup-Nachricht an die Navigationsleiste. Dadurch wird dieselbe Delegatmethode erneut aufgerufen, diesmal mit der Variablen "JA". Wenn die Variable auf YES gesetzt ist, setzt die Delegate-Methode sie auf NO und gibt YES zurück, damit der nicht animierte Pop auftreten kann. Nachdem der zweite Delegatenanruf zurückgekehrt ist, kehren wir zum ersten zurück, wo NO zurückgegeben wird, wodurch der ursprüngliche animierte Pop blockiert wird! Es ist eigentlich nicht so chaotisch, wie es sich anhört. Meine shouldPopItem-Methode sieht folgendermaßen aus:
Funktioniert bei mir.
quelle