viewDidAppear ist eine Methode von UIViewController, die UIKit aufruft, nachdem der Bildschirm vollständig auf dem Display erschienen ist und alle Übergangsanimationen abgeschlossen sind. Laut der Apple Developer Documentation garantiert diese Methode, dass die View für den Benutzer sichtbar und zur Interaktion bereit ist. viewDidAppear ist der optimale Ort zum Starten von Animationen, Tracking und asynchronen Operationen.
Wichtige Punkte
viewDidAppear ist eine Methode von UIViewController, die UIKit aufruft, nachdem die View zur Fensterhierarchie hinzugefügt wurde und die Übergangsanimation vollständig abgeschlossen ist. Zu diesem Zeitpunkt befindet sich der Bildschirm in seinem endgültigen Zustand: Er ist sichtbar, kann interagiert werden und alle UIKit-Animationen wurden gestoppt. Der Entwickler überschreibt diese Methode, um Aktionen auszuführen, die garantieren, dass der Bildschirm vor den Augen des Benutzers ist.
Im Gegensatz zu viewWillAppear, wo der Bildschirm nur für die Anzeige vorbereitet wird, signalisiert viewDidAppear, dass der Benutzer die Oberfläche bereits sieht. Dies ist ein kritischer Unterschied: Das Starten einer Animation in viewWillAppear kann zu verworfenen Frames führen, da UIKit noch den Übergang verarbeitet. In viewDidAppear ist der Übergang abgeschlossen und die Ressourcen des Controllers können zum Rendern neuer Inhalte verwendet werden.
Die Methode akzeptiert einen animated-Parameter vom Typ Bool, ähnlich wie viewWillAppear. Wenn true, wurde das Erscheinen des Bildschirms von einer Animation begleitet. Dieser Parameter kann verwendet werden, um das UI-Verhalten anzupassen: zum Beispiel das Überspringen einer Eingangsanimation bei einer nicht animierten Rückkehr.
viewDidAppear wird in allen Szenarien aufgerufen, in denen der Bildschirm seinen Erscheinungsprozess abgeschlossen hat. Schauen wir uns die Hauptfälle aus der Perspektive eines iOS-Entwicklers an.
Nachdem UINavigationController eine Push- oder Pop-Animation beendet hat, wird viewDidAppear auf dem Ziel-Controller aufgerufen. Beim ersten Bildschirm im Stack wird es nach der anfänglichen Öffnungsanimation ausgeführt. Dies ist das Hauptszenario, und es ist das, worauf Entwickler hauptsächlich abzielen, wenn sie Logik in viewDidAppear platzieren.
Wenn der Benutzer einen modal präsentierten Controller schließt und zum vorherigen zurückkehrt, ruft UIKit viewDidAppear auf dem zurückkehrenden Controller auf. Der animated-Parameter entspricht dann, ob der Dismiss mit Animation durchgeführt wurde. Dieser Moment ist wichtig, um die UI nach dem Erhalten von Daten von einem Kindbildschirm zu aktualisieren.
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
logScreenView()
startOnboardingAnimation()
}
UITabBarController ruft viewDidAppear auf dem Controller des ausgewählten Tabs auf, nachdem die Wechselanimation abgeschlossen ist. Dies unterscheidet sich von viewWillAppear, das beim Beginn des Wechsels ausgelöst wird. Wenn ein Tab eine Begrüßungsanimation hat oder Sie die aktive Zeit verfolgen müssen, ist viewDidAppear der richtige Ort.
Wenn die App aus dem Hintergrund in den Vordergrund zurückkehrt, können viewWillAppear und viewDidAppear auf dem sichtbaren Controller aufgerufen werden, wenn der Lebenszyklus der View vorübergehend unterbrochen wurde. Für eine zuverlässige Verfolgung der Rückkehr aus dem Hintergrund verwenden Sie jedoch separat UIApplication.willEnterForegroundNotification.
viewDidAppear erledigt Aufgaben, die für die korrekte Ausführung einen sichtbaren Bildschirm erfordern. Schauen wir uns die wichtigsten Anwendungsszenarien in realen Projekten an.
Die häufigste Aufgabe von viewDidAppear ist das Tracking von Bildschirmaufrufen. Analytiksysteme wie Firebase Analytics, Amplitude oder Mixpanel sollten Ereignisse nur erhalten, nachdem der Bildschirm dem Benutzer tatsächlich angezeigt wurde. Das Senden eines Ereignisses in viewWillAppear kann die Betrachtungszeit unterschätzen und falsche Auslöser erzeugen.
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
Analytics.logEvent(
name: "screen_view",
parameters: [
"screen_name": "ProfileScreen",
"screen_class": String(describing: self)
]
)
}
Animationen, die nach dem Erscheinen des Bildschirms beginnen sollen — gestaffeltes Erscheinen von Elementen, Parallaxe, Tutorials — werden in viewDidAppear gestartet. An diesem Punkt ist der Grafikkontext vollständig bereit, und die Animation wird flüssig sein, ohne Frame-Einbrüche zu Beginn. Dies ist besonders wichtig für Animationen, die UIViewPropertyAnimator verwenden.
Schwere asynchrone Operationen — Laden von hochauflösenden Bildern, Parsen großer JSONs, Initialisieren von Videos — werden besser in viewDidAppear als in viewDidLoad oder viewWillAppear gestartet. Wenn die Methode aufgerufen wird, sieht der Benutzer bereits die Oberfläche, sodass Sie ein Skelett oder einen Ladeindikator anzeigen können, ohne das Erscheinen des Bildschirms zu verzögern.
Wenn der Bildschirm Elemente enthält, die regelmäßige Aktualisierungen benötigen — Countdown-Timer, Fortschrittsanzeige, Fortschrittsanimation — werden sie in viewDidAppear gestartet und in viewDidDisappear gestoppt. Dies verhindert, dass Timer laufen, wenn der Bildschirm nicht sichtbar ist, und spart Akkulaufzeit und CPU-Ressourcen.
Medieninhalte — Video, Audio, Lottie-Animationen — werden in viewDidAppear gestartet, nicht früher. Wenn Sie die Wiedergabe in viewWillAppear starten, verpasst der Benutzer die ersten Sekunden, während der Bildschirm noch erscheint. In viewDidAppear können Sie einen AVPlayer oder eine Lottie-Animation starten, in dem Vertrauen, dass der Benutzer den Inhalt ab dem ersten Frame sieht. Dies ist besonders wichtig für Onboarding-Bildschirme und Startbildschirme, bei denen das genaue Timing entscheidend ist.
Der richtige Zeitpunkt zum Starten einer Animation wirkt sich direkt auf die Wahrnehmung der Flüssigkeit der Benutzeroberfläche aus. Der Unterschied zwischen dem Starten in viewWillAppear und viewDidAppear kann bei einfachen Animationen unbemerkt bleiben, wird aber bei komplexen Szenen kritisch.
Wenn UIKit einen Push-Übergang zwischen Bildschirmen durchführt, erstellt es Screenshots, animiert sie und ruft gleichzeitig viewWillAppear auf dem neuen Controller auf. Wenn Sie zu diesem Zeitpunkt eine schwere Animation starten — Parallaxe, Weichzeichnung, Transformation — kann UIKit Frames der Übergangsanimation verwerfen, was einen ruckelnden Effekt erzeugt. viewDidAppear garantiert, dass die Übergangsanimation abgeschlossen ist, und gibt Ihnen die volle Kontrolle über das Rendering.
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
UIView.animate(
withDuration: 0.6,
delay: 0.3,
usingSpringWithDamping: 0.8,
initialSpringVelocity: 0.5
) {
self.cardView.alpha = 1.0
self.cardView.transform = .identity
}
}
Verwenden Sie Verzögerungen und Dämpfung, um ein natürliches kaskadierendes Erscheinen von Elementen zu erzeugen. Dieser Ansatz verbessert die Wahrnehmung der Benutzeroberfläche und erhöht die Verweildauer — Benutzer verbringen mehr Zeit mit der Erkundung von Inhalten, was sich positiv auf die Verhaltensmetriken auswirkt.
Die falsche Verwendung von viewDidAppear kann zu Leistungsproblemen, unerwartetem Animationsverhalten und übermäßigem Tracking führen. Schauen wir uns häufige Fehler an.
Der erste Fehler sind mehrfache Aufrufe. viewDidAppear kann in bestimmten Szenarien mehrmals aufgerufen werden: Tab-Wechsel, Rückkehr aus dem Hintergrund, modale Übergänge. Wenn die Methode eine schwere Operation ohne Flag-Prüfung ausführt, wird sie dupliziert. Verwenden Sie ein hasAppeared-Flag oder dispatchOnce für einmalige Aktionen.
Der zweite Fehler ist das Starten von Netzwerkanfragen ohne Abbruch beim Ausblenden. Wenn der Benutzer den Bildschirm verlässt, bevor die Anfrage abgeschlossen ist, kann das Ergebnis auf eine bereits ausgeblendete View angewendet werden. Verwenden Sie abbrechbare URLSessionTask und brechen Sie sie in viewDidDisappear ab.
Der dritte Fehler ist das Tracking in viewWillAppear statt in viewDidAppear. Einige Entwickler senden Analytik-Ereignisse in viewWillAppear, aber dies erzeugt falsche Auslöser, wenn der Bildschirm nicht erschienen ist (z. B. aufgrund einer abgebrochenen Pop-Geste). viewDidAppear ist der einzige zuverlässige Indikator dafür, dass der Benutzer den Bildschirm tatsächlich gesehen hat.
Der vierte Fehler ist das Vergessen von super. Der Aufruf von super.viewDidAppear ist für die korrekte Funktion von UINavigationController, UITabBarController und UISplitViewController erforderlich. Ohne ihn können die standardmäßigen Navigations- und UI-Aktualisierungsmechanismen brechen.
Der fünfte Fehler ist das Ändern der Ausrichtung oder Bildschirmgröße ohne Berücksichtigung von viewDidLayoutSubviews. Wenn Ihre Animation in viewDidAppear von den endgültigen View-Abmessungen abhängt, denken Sie daran, dass viewDidLayoutSubviews mehrmals vor viewDidAppear aufgerufen worden sein kann. Beim ersten Erscheinen des Bildschirms wird das Layout abgeschlossen, bevor viewDidAppear aufgerufen wird, aber bei späteren Größenänderungen — z. B. beim Drehen des Geräts — wird viewDidAppear möglicherweise nicht aufgerufen, und Ihre Animation wird nicht gestartet. Verwenden Sie in solchen Fällen viewDidLayoutSubviews mit einer Überprüfung des firstLayout-Flags.
Eine korrekte Implementierung beinhaltet das Beibehalten eines Verweises auf das Animationsobjekt und dessen expliziten Abbruch beim Verlassen des Bildschirms. Der sechste Fehler ist das Starten unendlicher Animationen ohne ein Stopp-Flag. Wenn Sie in viewDidAppear eine sich wiederholende Animation starten (z. B. einen pulsierenden Indikator oder einen sich drehenden Ladebalken), sie aber nicht in viewDidDisappear stoppen, verbraucht die Animation GPU-Ressourcen, selbst wenn der Bildschirm ausgeblendet ist. Behalten Sie immer einen Verweis auf die aktive Animation und rufen Sie removeAllAnimations oder setCompletion in der entsprechenden Lebenszyklusmethode auf.
Der siebte Fehler ist das Ignorieren von viewDidDisappear zum Stoppen von Aktivitäten. Wenn Sie in viewDidAppear mit dem Lauschen auf GPS, Beschleunigungssensor oder Gyroskop begonnen haben, stellen Sie sicher, dass Sie es in viewDidDisappear stoppen. Andernfalls arbeiten die Sensoren im Hintergrund weiter, entladen den Akku, selbst wenn der Benutzer längst zu einem anderen Bildschirm gewechselt ist. Verwenden Sie gepaarte Start- und Stopp-Aufrufe in den entsprechenden Lebenszyklusmethoden — dies garantiert eine korrekte Ressourcenverwaltung des Geräts.
Häufig gestellte Fragen
viewWillAppear wird vor der Erscheinungsanimation aufgerufen, wenn der Bildschirm noch nicht sichtbar ist. viewDidAppear wird aufgerufen, nachdem die Animation vollständig abgeschlossen ist, wenn der Bildschirm sichtbar und für Interaktionen verfügbar ist.
In viewDidAppear ist die Übergangsanimation von UIKit bereits abgeschlossen und alle Rendering-Ressourcen sind für Ihren Controller verfügbar. Früheres Starten von Animationen kann zu verworfenen Frames und einer ruckeligen Benutzeroberfläche führen.
In einem normalen Lebenszyklus nein — viewDidAppear folgt immer auf viewWillAppear. Bei bestimmten Zustandswiederherstellungsszenarien kann das System jedoch nur viewDidAppear aufrufen.
Fügen Sie eine Flag-Prüfung für firstAppearance hinzu oder verwenden Sie eine Kombination aus Zähler und Bildschirmname. Senden Sie das screen_view-Ereignis beispielsweise nur, wenn firstAppearance = true ist, und setzen Sie dann das Flag zurück.
Bei der Rückkehr aus dem Hintergrund kann UIKit viewDidAppear auf dem sichtbaren Controller aufrufen, wenn die View aus dem Speicher entladen wurde. Für eine zuverlässige Verfolgung verwenden Sie AppDelegate-Benachrichtigungen.
Zusammenfassung
Wir entwickeln eine mobile Applikation schlüsselfertig
IT Sectr entwickelt seit 2017 iOS- und Android-Apps für Startups und Unternehmen. Wir beraten Sie und schlagen die beste Lösung vor.
Lesen Sie auch