Какой новый метод появился в iOS 13 для определения готовности UIView к отображению
Что проверяют
Знаете ли вы жизненный цикл экрана и момент, когда у view уже правильные размеры, safe area и трейты. Вопрос сформулирован неточно, и интервьюер заодно смотрит, заметите ли вы это. Следом обычно просят расставить методы жизненного цикла по порядку.
Как отвечать
Скорее всего, имеется в виду viewIsAppearing(_:). Это метод UIViewController, а не UIView: его представили вместе с iOS 17 SDK в Xcode 15, но он обратно совместим до iOS 13, поэтому в документации значится с этой версии.
- когда вызывается: после
viewWillAppear(_:)и доviewDidAppear(_:), один раз на каждое появление экрана; - что уже готово: view добавлен в иерархию, trait collection у контроллера и view актуальны, размер и safe area выставлены родителем;
- зачем нужен: код, зависящий от геометрии, раньше жил в
viewWillAppear(_:), где размеры бывают неточными, или вviewDidLayoutSubviews(), который срабатывает многократно. Теперь есть отдельная точка: прокрутить к нужной ячейке, задать отступы, запустить анимацию появления.
Порядок: viewDidLoad(), viewWillAppear(_:), viewIsAppearing(_:), viewDidAppear(_:), а методы раскладки viewWillLayoutSubviews() и viewDidLayoutSubviews() могут срабатывать несколько раз вокруг этих точек.
Если речь именно о UIView, сигналы готовности у него другие: didMoveToWindow() с проверкой window != nil и layoutSubviews() для раскладки. С iOS 17 на смену трейтов подписываются через registerForTraitChanges, а traitCollectionDidChange(_:) помечен устаревшим.
Сама iOS 13 принесла сцены (UIScene, UIWindowScene) и тёмную тему, но отдельного метода готовности у UIView в ней не появилось.
Где спотыкаются
Называют layoutIfNeeded(). Он есть в UIKit с самых ранних версий и не сообщает о готовности, а принудительно и синхронно раскладывает view прямо сейчас.
Считают по view.bounds в viewDidLoad(). Там размер ещё взят из storyboard или равен нулю, и на реальном устройстве вёрстка съезжает.
Кладут одноразовую настройку в viewDidLayoutSubviews(). Метод зовётся при каждом изменении раскладки, например при повороте, и код без флага выполняется снова и снова.