viewDidAppear, UIKit’in ekran görüntüde tamamen göründükten ve tüm geçiş animasyonları tamamlandıktan sonra çağırdığı bir UIViewController yöntemidir. Apple Developer Documentation’a göre, bu yöntem View’in kullanıcı için görünür ve etkileşime hazır olduğunu garanti eder. viewDidAppear, animasyonları, izlemeyi ve asenkron işlemleri başlatmak için en uygun yerdir.
Önemli Noktalar
viewDidAppear, View pencere hiyerarşisine eklendikten ve geçiş animasyonu tamamen tamamlandıktan sonra UIKit’in çağırdığı bir UIViewController yöntemidir. Bu noktada ekran son durumundadır: görünür, etkileşime açık ve tüm UIKit animasyonları durmuştur. Geliştirici, ekranın kullanıcının gözünün önünde olduğunun garanti edilmesini gerektiren eylemleri gerçekleştirmek için bu yöntemi geçersiz kılar.
viewWillAppear’ın aksine, ekranın yalnızca gösterilmeye hazırlandığı yerde, viewDidAppear kullanıcının arayüzü zaten gördüğünü belirtir. Bu kritik bir farktır: viewWillAppear’da bir animasyon başlatmak, UIKit hâlâ geçişi işlediğinden kare düşmesine neden olabilir. viewDidAppear’da geçiş tamamlanmıştır ve denetleyicinin kaynakları yeni içerik oluşturmak için kullanılabilir.
Yöntem, viewWillAppear’a benzer şekilde Bool türünde bir animated parametresi kabul eder. true ise, ekranın görünmesine animasyon eşlik etmiştir. Bu parametre, arayüz davranışını uyarlamak için kullanılabilir: örneğin, animasyonsuz bir dönüşte giriş animasyonunu atlamak.
viewDidAppear, ekranın görünme sürecini tamamladığı tüm senaryolarda çağrılır. Bir iOS geliştiricisinin bakış açısından ana durumları inceleyelim.
UINavigationController bir push veya pop animasyonunu bitirdikten sonra, hedef denetleyicide viewDidAppear çağrılır. Yığındaki ilk ekran için, ilk açılış animasyonundan sonra çalışır. Bu ana senaryodur ve geliştiricilerin viewDidAppear’a mantık yerleştirirken öncelikli olarak hedefledikleri şeydir.
Kullanıcı modal olarak sunulan bir denetleyiciyi kapatıp öncekine döndüğünde, UIKit dönen denetleyicide viewDidAppear’ı çağırır. animated parametresi, dismiss işleminin animasyonla yapılıp yapılmadığına karşılık gelir. Bu an, alt ekrandan veri aldıktan sonra arayüzü güncellemek için önemlidir.
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
logScreenView()
startOnboardingAnimation()
}
UITabBarController, değiştirme animasyonu tamamlandıktan sonra seçili sekmenin denetleyicisinde viewDidAppear’ı çağırır. Bu, değişimin başlangıcında tetiklenen viewWillAppear’dan farklıdır. Bir sekmede karşılama animasyonu varsa veya aktif süreyi izlemeniz gerekiyorsa, viewDidAppear doğru yerdir.
Uygulama arka plandan ön plana döndüğünde, View’in yaşam döngüsü geçici olarak askıya alınmışsa, görünür denetleyicide viewWillAppear ve viewDidAppear çağrılabilir. Bununla birlikte, arka plandan dönüşü güvenilir bir şekilde izlemek için ayrı olarak UIApplication.willEnterForegroundNotification kullanın.
viewDidAppear, doğru yürütme için görünür bir ekran gerektiren görevleri halleder. Gerçek projelerdeki ana kullanım senaryolarına bakalım.
viewDidAppear’ın en yaygın görevi ekran görüntülemelerini izlemektir. Firebase Analytics, Amplitude veya Mixpanel gibi analitik sistemleri, olayları yalnızca ekran kullanıcıya gerçekten gösterildikten sonra almalıdır. viewWillAppear’da bir olay göndermek, görüntüleme süresini düşük gösterebilir ve yanlış tetiklemeler oluşturabilir.
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
Analytics.logEvent(
name: "screen_view",
parameters: [
"screen_name": "ProfileScreen",
"screen_class": String(describing: self)
]
)
}
Ekran göründükten sonra başlaması gereken animasyonlar — öğelerin kademeli görünmesi, paralaks, eğitimler — viewDidAppear’da başlatılır. Bu noktada grafik bağlamı tamamen hazırdır ve animasyon başlangıçta kare düşmesi olmadan akıcı olacaktır. Bu, özellikle UIViewPropertyAnimator kullanan animasyonlar için önemlidir.
Ağır asenkron işlemler — yüksek çözünürlüklü görüntüleri yükleme, büyük JSON’ları ayrıştırma, videoyu başlatma — viewDidLoad veya viewWillAppear yerine viewDidAppear’da başlatmak daha iyidir. Yöntem çağrıldığında, kullanıcı zaten arayüzü görmektedir, bu nedenle ekran görünümünü geciktirmeden bir iskelet veya yükleyici gösterebilirsiniz.
Ekranda periyodik güncellemeler gerektiren öğeler varsa — geri sayım zamanlayıcısı, ilerleme göstergesi, ilerleme animasyonu — bunlar viewDidAppear’da başlatılır ve viewDidDisappear’da durdurulur. Bu, ekran görünür olmadığında zamanlayıcıların çalışmasını önleyerek pil ömründen ve CPU kaynaklarından tasarruf sağlar.
Medya içeriği — video, ses, Lottie animasyonları — daha önce değil, viewDidAppear’da başlatılır. Oynatmayı viewWillAppear’da başlatırsanız, kullanıcı ekran hâlâ görünürken ilk birkaç saniyeyi kaçıracaktır. viewDidAppear’da, kullanıcının içeriği ilk kareden itibaren gördüğüne güvenerek bir AVPlayer veya Lottie animasyonu başlatabilirsiniz. Bu, hassas zamanlamanın önemli olduğu tanıtım ekranları ve açılış ekranları için özellikle önemlidir.
Bir animasyonu başlatmak için doğru zaman, arayüzün akıcılık algısını doğrudan etkiler. viewWillAppear ve viewDidAppear’da başlatma arasındaki fark, basit animasyonlar için fark edilmeyebilir, ancak karmaşık sahneler için kritik hale gelir.
UIKit ekranlar arasında bir push geçişi gerçekleştirdiğinde, ekran görüntüleri alır, bunları canlandırır ve aynı anda yeni denetleyicide viewWillAppear’ı çağırır. Bu noktada ağır bir animasyon başlatırsanız — paralaks, bulanıklık, dönüşüm — UIKit geçiş animasyonunun karelerini düşürebilir ve sarsıntılı bir etki yaratabilir. viewDidAppear, geçiş animasyonunun tamamlandığını garanti ederek size oluşturma üzerinde tam kontrol sağlar.
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
}
}
Öğelerin doğal bir kademeli görünümünü oluşturmak için gecikmeler ve sönümleme kullanın. Bu yaklaşım, arayüz algısını iyileştirir ve kalma süresini artırır — kullanıcılar içeriği keşfetmek için daha fazla zaman harcar ve bu da davranışsal metrikleri olumlu etkiler.
Yanlış kullanım viewDidAppear, performans sorunlarına, beklenmeyen animasyon davranışına ve aşırı izlemeye yol açabilir. Yaygın hatalara bakalım.
İlk hata birden çok çağrıdır. viewDidAppear, belirli senaryolarda birkaç kez çağrılabilir: sekme değiştirme, arka plandan dönüş, modal geçişler. Yöntem bir bayrak kontrolü olmadan ağır bir işlem gerçekleştirirse, yinelenir. Tek seferlik eylemler için bir hasAppeared bayrağı veya dispatchOnce kullanın.
İkinci hata, gizleme sırasında iptal edilmeden ağ istekleri başlatmaktır. Kullanıcı istek tamamlanmadan önce ekrandan ayrılırsa, sonuç zaten gizli bir View’e uygulanabilir. İptal edilebilir URLSessionTask kullanın ve bunları viewDidDisappear’da iptal edin.
Üçüncü hata, viewDidAppear yerine viewWillAppear’da izleme yapmaktır. Bazı geliştiriciler viewWillAppear’da analitik olayları gönderir, ancak bu, ekran görünmezse (örneğin, iptal edilen bir pop hareketi nedeniyle) yanlış tetiklemeler oluşturur. viewDidAppear, kullanıcının ekranı gerçekten gördüğünün tek güvenilir göstergesidir.
Dördüncü hata, super’i unutmaktır. super.viewDidAppear çağrısı, UINavigationController, UITabBarController ve UISplitViewController’ın doğru çalışması için gereklidir. Bu olmadan, standart navigasyon ve arayüz güncelleme mekanizmaları bozulabilir.
Beşinci hata, viewDidLayoutSubviews’ı dikkate almadan yönlendirmeyi veya ekran boyutunu değiştirmektir. viewDidAppear’daki animasyonunuz View’in son boyutlarına bağlıysa, viewDidLayoutSubviews’ın viewDidAppear’dan önce birkaç kez çağrılmış olabileceğini unutmayın. İlk ekran görünümünde, viewDidAppear çağrılmadan önce düzen tamamlanır, ancak sonraki boyut değişikliklerinde — örneğin, cihaz döndürüldüğünde — viewDidAppear çağrılmayabilir ve animasyonunuz başlamaz. Bu gibi durumlarda, firstLayout bayrak kontrolü ile viewDidLayoutSubviews kullanın.
Doğru uygulama, animasyon nesnesine bir referans tutmayı ve ekrandan ayrılırken onu açıkça iptal etmeyi içerir. Altıncı hata, durdurma bayrağı olmadan sonsuz animasyonlar başlatmaktır. viewDidAppear’da yinelenen bir animasyon başlatır (örneğin, titreşen bir gösterge veya dönen bir yükleyici) ancak viewDidDisappear’da durdurmazsanız, animasyon ekran gizliyken bile GPU kaynaklarını tüketir. Her zaman etkin animasyona bir referans tutun ve ilgili yaşam döngüsü yönteminde removeAllAnimations veya setCompletion’ı çağırın.
Yedinci hata, etkinlikleri durdurmak için viewDidDisappear’ı görmezden gelmektir. viewDidAppear’da GPS, ivmeölçer veya jiroskop dinlemeye başladıysanız, bunu viewDidDisappear’da durdurduğunuzdan emin olun. Aksi takdirde, kullanıcı çoktan başka bir ekrana geçmiş olsa bile sensörler arka planda çalışmaya devam ederek pili tüketir. İlgili yaşam döngüsü yöntemlerinde eşleştirilmiş başlatma ve durdurma çağrıları kullanın — bu, cihaz kaynaklarının doğru yönetimini garanti eder.
Sıkça Sorulan Sorular
viewWillAppear, ekran henüz görünmezken görünme animasyonundan önce çağrılır. viewDidAppear, animasyon tamamen tamamlandıktan sonra, ekran görünür ve etkileşim için kullanılabilir olduğunda çağrılır.
viewDidAppear’da, UIKit’in geçiş animasyonu zaten tamamlanmıştır ve tüm oluşturma kaynakları denetleyiciniz için kullanılabilir. Animasyonları daha erken başlatmak, kare düşmesine ve sarsıntılı bir arayüze neden olabilir.
Normal bir yaşam döngüsünde, hayır — viewDidAppear her zaman viewWillAppear’ı takip eder. Ancak, belirli durum geri yükleme senaryolarında sistem yalnızca viewDidAppear’ı çağırabilir.
firstAppearance için bir bayrak kontrolü ekleyin veya bir sayaç ve ekran adı kombinasyonu kullanın. Örneğin, screen_view olayını yalnızca firstAppearance = true olduğunda gönderin, ardından bayrağı sıfırlayın.
Arka plandan dönüşte, View bellekten boşaltılmışsa UIKit, görünür denetleyicide viewDidAppear’ı çağırabilir. Güvenilir izleme için AppDelegate bildirimlerini kullanın.
Özet
Anahtar teslim bir mobil uygulama geliştireceğiz
IT Sectr, 2017'den beri girişimler ve işletmeler için iOS ve Android uygulamaları oluşturmaktadır. Size danışmanlık yapacak ve en iyi çözümü önereceğiz.
Ayrıca okuyun