viewDidAppear egy UIViewController metódus, amelyet az UIKit hív meg, miután a képernyő teljesen megjelent a kijelzőn, és az összes átmeneti animáció befejeződött. A Apple Developer Documentation szerint ez a metódus garantálja, hogy a View látható a felhasználó számára és készen áll az interakcióra. viewDidAppear az optimális hely az animációk, nyomkövetés és aszinkron műveletek elindítására.
Főbb pontok
viewDidAppear egy UIViewController metódus, amelyet az UIKit hív meg, miután a View hozzáadásra került az ablak hierarchiához, és az átmeneti animáció teljesen befejeződött. Ebben a pillanatban a képernyő a végső állapotban van: látható, lehet vele interakcióba lépni, az összes UIKit animáció leállt. A fejlesztő felülírja ezt a metódust olyan műveletek végrehajtásához, amelyekhez a képernyő garantáltan a felhasználó szeme előtt kell hogy legyen.
Ellentétben a viewWillAppear-rel, ahol a képernyő csak készül a megjelenítésre, a viewDidAppear jelzi, hogy a felhasználó már látja a felületet. Ez kritikus különbség: az animáció elindítása a viewWillAppear-ben kihagyott képkockákhoz vezethet, mivel az UIKit még dolgozza fel az átmenetet. A viewDidAppear-ben az átmenet befejeződött, és a vezérlő erőforrásai felhasználhatók az új tartalom renderelésére.
A metódus fogadja az animated paramétert, amely Bool típusú, hasonlóan a viewWillAppear-hez. Ha true — a képernyő megjelenését animáció kísérte. Ez a paraméter felhasználható a UI viselkedésének testreszabására: például a belépő animáció kihagyására nem animált visszatérés esetén.
viewDidAppear minden olyan forgatókönyvben meghívódik, amikor a képernyő befejezte a megjelenési folyamatot. Vizsgáljuk meg a fő eseteket egy iOS fejlesztő szemszögéből.
Miután az UINavigationController befejezte a push vagy pop animációt, a célvezérlőn meghívódik a viewDidAppear. A verem első képernyője esetében a kezdeti nyitó animáció után aktiválódik. Ez a fő forgatókönyv, és erre hivatkozunk a logika viewDidAppear-be helyezésekor.
Amikor a felhasználó bezár egy modálisan megjelenített vezérlőt, és visszatér az előző képernyőre, az UIKit meghívja a viewDidAppear-t a visszatérő vezérlőn. Az animated paraméter annak megfelelően lesz beállítva, hogy a dismiss animációval történt-e. Ez a pillanat fontos a UI frissítéséhez, miután adatokat kaptunk a gyermekképernyőről.
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
logScreenView()
startOnboardingAnimation()
}
UITabBarController meghívja a viewDidAppear-t a kiválasztott lap vezérlőjén a váltás befejezése után. Ez különbözik a viewWillAppear-től, amely a váltás kezdetekor aktiválódik. Ha a lapon van üdvözlő animáció, vagy nyomon kell követni az aktív időt, a viewDidAppear a megfelelő hely.
Amikor az alkalmazás visszatér a background-ból a foreground-ba, a látható vezérlőn meghívódhat a viewWillAppear és a viewDidAppear, ha a View életciklusa ideiglenesen fel volt függesztve. A háttérből való visszatérés megbízható nyomon követéséhez azonban külön használja a UIApplication.willEnterForegroundNotification értesítést.
viewDidAppear olyan feladatokat old meg, amelyek a helyes végrehajtáshoz látható képernyőt igényelnek. Vizsgáljuk meg a kulcsfontosságú használati forgatókönyveket valós projektekben.
A viewDidAppear leggyakoribb feladata — a képernyőmegtekintés nyomon követése. Az analitikai rendszerek, mint a Firebase Analytics, Amplitude vagy Mixpanel, csak azután kaphatnak eseményeket, hogy a képernyő ténylegesen megjelent a felhasználónak. Az esemény viewWillAppear-ben történő küldése csökkentheti a megtekintési időt, és hamis triggereket hozhat létre.
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
Analytics.logEvent(
name: "screen_view",
parameters: [
"screen_name": "ProfileScreen",
"screen_class": String(describing: self)
]
)
}
Az animációk, amelyeknek a képernyő megjelenése után kell kezdődniük — elemek megjelenése késleltetéssel, parallaxis, tutorial — a viewDidAppear-ben indulnak el. Ebben a pillanatban a grafikus kontextus teljesen készen áll, és az animáció sima lesz, képkockák kihagyása nélkül a kezdetkor. Ez különösen fontos a UIViewPropertyAnimator-t használó animációk esetében.
Nehéz aszinkron műveletek — nagy felbontású képek betöltése, nagy JSON-ok feldolgozása, videó inicializálása — jobb a viewDidAppear-ben elindítani, mint a viewDidLoad vagy viewWillAppear metódusokban. A metódus meghívásakor a felhasználó már látja a felületet, így megjeleníthető egy váz vagy betöltő, anélkül hogy késleltetnénk a képernyő megjelenését.
Ha a képernyőn vannak olyan elemek, amelyek periodikus frissítést igényelnek — visszaszámláló időzítő, betöltésjelző, folyamat animáció — ezek a viewDidAppear-ben indulnak el, és a viewDidDisappear-ben állnak le. Ez megakadályozza az időzítők működését, amikor a képernyő nem látható, kímélve az akkumulátort és a CPU erőforrásokat.
A média tartalom — videó, audio, Lottie animációk — pontosan a viewDidAppear-ben indul, nem korábban. Ha a viewWillAppear-ben kezdi a lejátszást, a felhasználó kihagyja az első másodperceket, amíg a képernyő még megjelenik. A viewDidAppear-ben elindíthatja az AVPlayer-t vagy a Lottie animációt azzal a bizonyossággal, hogy a felhasználó az első képkockától látja a tartalmat. Ez különösen fontos az onboarding képernyők és splash screen-ek esetében, ahol a pontos időzítés kulcsfontosságú.
A megfelelő pillanat az animáció elindítására közvetlenül befolyásolja a felület simaságának érzékelését. A különbség a viewWillAppear-ben és a viewDidAppear-ben történő indítás között észrevehetetlen lehet egyszerű animációknál, de kritikus az összetett jeleneteknél.
Amikor az UIKit push-átmenetet hajt végre a képernyők között, képernyőképeket készít, animálja azokat, és egyidejűleg meghívja a viewWillAppear-t az új vezérlőn. Ha ebben a pillanatban elindít egy nehéz animációt — parallaxist, blur-t, transzformációt — az UIKit kihagyhatja az átmeneti animáció képkockáit, rángatózó hatást keltve. A viewDidAppear garantálja, hogy az átmeneti animáció befejeződött, és teljes ellenőrzése van a renderelés felett.
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
}
}
Használjon késleltetéseket és csillapítást a természetes kaszkád megjelenés létrehozásához az elemeknél. Ez a megközelítés javítja a felület érzékelését és növeli a dwell time-t — a felhasználó hosszabb ideig tanulmányozza a tartalmat, ami pozitívan befolyásolja a viselkedési mutatókat.
Helytelen használat a viewDidAppear teljesítményproblémákhoz, az animációk váratlan viselkedéséhez és túlzott nyomkövetéshez vezethet. Vizsgáljuk meg a gyakori hibákat.
Első hiba — többszörös meghívások. A viewDidAppear bizonyos forgatókönyvekben többször is meghívódhat: lapváltás, visszatérés a háttérből, modális átmenetek. Ha a metódusban egy nehéz művelet zászló ellenőrzése nélkül fut, az megduplázódik. Egyszeri műveletekhez használja a hasAppeared zászlót vagy a dispatchOnce-t.
Második hiba — hálózati kérések indítása megszakítás nélkül elrejtéskor. Ha a felhasználó elhagyja a képernyőt a kérés befejezése előtt, az eredmény alkalmazható a már elrejtett View-re. Használjon megszakítható URLSessionTask-eket, és fejezze be őket a viewDidDisappear-ben.
Harmadik hiba — nyomkövetés a viewWillAppear-ben a viewDidAppear helyett. Néhány fejlesztő analytics eseményeket küld a viewWillAppear-ben, de ez hamis triggereket hoz létre, ha a képernyő nem jelent meg (például egy megszakított pop gesztus esetén). A viewDidAppear az egyetlen megbízható jelző arra, hogy a felhasználó ténylegesen látta a képernyőt.
Negyedik hiba — a super elfelejtése. A super.viewDidAppear hívása szükséges az UINavigationController, UITabBarController és UISplitViewController helyes működéséhez. Enélkül a szabványos navigációs és felületfrissítési mechanizmusok eltörhetnek.
Ötödik hiba — a tájolás vagy képernyőméret megváltoztatása a viewDidLayoutSubviews figyelembevétele nélkül. Ha az animációja a viewDidAppear-ben függ a View végső méreteitől, ne feledje, hogy a viewDidLayoutSubviews többször is meghívódhat a viewDidAppear előtt. A képernyő első megjelenésekor a layout a viewDidAppear hívása előtt befejeződik, de későbbi méretváltozásoknál — például az eszköz elforgatásakor — a viewDidAppear nem hívódhat meg, és az animációja nem indul el. Ilyen esetekben használja a viewDidLayoutSubviews-t a firstLayout zászló ellenőrzésével.
A helyes implementáció magában foglalja az animációs objektum referenciájának megőrzését és annak explicit megszakítását a képernyő elhagyásakor. Hatodik hiba — végtelen animációk indítása leállító zászló nélkül. Ha a viewDidAppear-ben elindít egy ismétlődő animációt (például pulzáló jelzőt vagy forgó betöltőt), de nem állítja le a viewDidDisappear-ben, az animáció GPU erőforrásokat fog fogyasztani, még ha a képernyő rejtve is van. Mindig őrizze meg a referenciát az aktív animációra, és hívja meg a removeAllAnimations vagy setCompletion függvényt a megfelelő életciklus-lezáró metódusban.
Hetedik hiba — a viewDidDisappear figyelmen kívül hagyása a tevékenységek leállításához. Ha elindította a GPS, gyorsulásmérő vagy giroszkóp figyelését a viewDidAppear-ben, feltétlenül állítsa le a viewDidDisappear-ben. Ellenkező esetben az érzékelők tovább fognak működni a háttérben, fogyasztva az akkumulátort, még akkor is, ha a felhasználó már régen másik képernyőre váltott. Használjon párosított start és stop hívásokat az életciklus megfelelő metódusaiban — ez garantálja az eszköz erőforrásainak helyes kezelését.
Gyakran Ismételt Kérdések
viewWillAppear a megjelenési animáció előtt hívódik meg, amikor a képernyő még nem látható. A viewDidAppear — az animáció teljes befejeződése után, amikor a képernyő látható és elérhető az interakcióhoz.
A viewDidAppear-ben az UIKit átmeneti animációja már befejeződött, és az összes renderelési erőforrás elérhető a vezérlője számára. Az animáció korábbi elindítása kihagyott képkockákhoz és rángatózó felülethez vezethet.
Normál életciklusban nem — a viewDidAppear mindig a viewWillAppear után következik. Bizonyos állapot-visszaállítási forgatókönyvekben azonban a rendszer csak a viewDidAppear-t hívhatja meg.
Adjon hozzá egy első megjelenés zászló ellenőrzést, vagy használjon számláló és képernyőnév kombinációt. Például küldje el a screen_view eseményt csak akkor, ha firstAppearance = true, majd állítsa vissza a zászlót.
A háttérből való visszatéréskor az UIKit meghívhatja a viewDidAppear-t a látható vezérlőn, ha a View ki lett ürítve a memóriából. A megbízható nyomon követéshez használja az AppDelegate értesítéseit.
Összefoglaló
Kulcsrakész mobilalkalmazást fejlesztünk
Az IT Sectr 2017 óta készít iOS és Android alkalmazásokat induló vállalkozásoknak és vállalkozásoknak. Tanácsot adunk, és a legjobb megoldást javasoljuk.
Olvassa el is