Sobes.tech
Middle

V jaké fázi UIViewController dostává informace o svém rozměru?

sobes.tech AI

Odpověď od AI

View získává informace o svém rozměru v metodách životního cyklu UIViewController, které souvisejí s řízením rozvržení a zobrazení. Konkrétně jsou tyto informace nejspolehlivější poté, co systém vypočítal počáteční velikosti a pozice prvků UI, ale před jejich přímým zobrazením.

Hlavní metody, kde je velikost view určena:

  • viewWillLayoutSubviews: je volána před tím, než jsou subview uspořádány. V tuto chvíli je velikost view již stanovena a může být použita k úpravě rozvržení subview.
  • viewDidLayoutSubviews: je volána po tom, co jsou subview uspořádány (layout). V tuto chvíli je velikost view a jeho subview definitivně nastavena po cyklu rozvržení.

Navíc lze velikost získat v viewSafeAreaInsetsDidChange(), které je voláno při změnách bezpečných oblastí.

Nedoporučuje se používat viewDidLoad k získání přesné velikosti view, protože v době jeho volání hierarchie pohledů ještě není plně nakonfigurována, a velikosti mohou být nesprávné.

Příklad získání velikosti v viewDidLayoutSubviews:

override func viewDidLayoutSubviews() {  
    super.viewDidLayoutSubviews()  
    // Kontrola velikosti kořenového view
    let viewSize = view.bounds.size
    print("Velikost view: \(viewSize)")
    // Provést úkoly závislé na velikosti:
    // rozvržení subview, nastavení velikosti posuvného obsahu atd.
}

Tabulka srovnání metod životního cyklu podle dostupnosti informací o velikosti:

Metoda Velikost view je dostupná? Kdy je volána?
viewDidLoad Ne (nepřesné) Po načtení view, před jeho zobrazením na obrazovce.
viewWillAppear(_:) Ne (nepřesné) Před tím, než view bude zobrazeno na obrazovce.
viewWillLayoutSubviews Ano Před rozmístěním subview.
viewDidLayoutSubviews Ano Po rozmístění subview.
viewDidAppear(_:) Ano Po zobrazení view na obrazovce.
viewSafeAreaInsetsDidChange() Ano Při změnách bezpečných oblastí (Safe Area).