Middle
Prečo indikátor aktivity pokračuje v činnosti po zastavení aplikácie?
sobes.tech AI
Odpoveď od AI
Dôvod je v tom, že v iOS do iOS 11, UIActivityIndicatorView (indikátor aktivity) pokračoval v animácii, aj keď bola volaná jeho metóda stopAnimating(), ale kontrolér pohľadu alebo jeho rodičovský kontrolér nebol úplne uvoľnený z pamäte. Indikátor jednoducho prestal byť vizuálne zobrazený, ale jeho vnútorný stav zostával "animujúci".
S iOS 11 sa správanie zmenilo. Teraz stopAnimating() naozaj zastaví animáciu a zmení vnútorný stav indikátora.
Ak hovoríme o starších verziách iOS alebo o potenciálnych chybách v kóde, príčinou môže byť nasledovné:
- Problém s životným cyklom VC:
stopAnimating()sa volá v nevyhnutných stavoch životného cyklu kontroléra pohľadu (napríklad len vviewWillDisappear, ale nie vviewDidDisappearalebo pri spracovaní chýb). - Nesprávne riadenie objektu: Indikátor stále existuje v pamäti a jeho stav sa neresetuje, ak nie je správne uvoľnený alebo ak existujú silné odkazy, ktoré bránia uvoľneniu.
- Chyby multithreadingu: Volanie
stopAnimating()sa deje mimo hlavného vlákna, zatiaľ čo animácia UI prvkov môže byť riadená iba z hlavného vlákna.
// Príklad správneho volania na hlavnom vlákne
DispatchQueue.main.async {
activityIndicator.stopAnimating()
}
- Problém s hierarchiou pohľadov: Pohľad obsahujúci indikátor nebol odstránený z nadriadeného pohľadu alebo nebol úplne skrytý.
// Príklad odstránenia z nadriadeného pohľadu
activityIndicator.removeFromSuperview()
// Príklad skrytia
activityIndicator.isHidden = true
- Chyby pri práci s Auto Layout: Indikátor stále zaberá miesto alebo jeho rozmery nie sú po zastavení animácie resetované, čím sa vytvára ilúzia aktivity alebo prítomnosti.
V moderných verziách iOS je tento problém zriedkavý a zvyčajne je spôsobený chybami v riadení životného cyklu objektov alebo multithreadingu.