Выбор ответа Junior UIKit обновлено
Где брать финальный размер view
Вопрос
Почему в viewDidLoad нельзя полагаться на view.bounds для расчёта раскладки?
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Правильный ответ: Размеры ещё не выставлены; финальные будут в viewDidLayoutSubviews. В viewDidLoad view создано, но его размер часто ещё взят из storyboard или равен размеру по умолчанию: раскладку контейнер (навигация, safe area, ротация) делает позже.
Варианты ответа
boundsвviewDidLoadвсегда равен нулю, и расчёт приводит к крэшу- В
viewDidLoadview ещё не создано, обращение к нему загрузит его заново - Размеры ещё не выставлены; финальные будут в
viewDidLayoutSubviewsправильный ответ boundsдоступен только вviewDidAppear, до этого онnil
Разбор
В viewDidLoad view создано, но его размер часто ещё взят из storyboard или равен размеру по умолчанию: раскладку контейнер (навигация, safe area, ротация) делает позже. Ручные расчёты фреймов делают в viewDidLayoutSubviews или layoutSubviews, а лучше вообще поручают Auto Layout. Крэша нет, просто значения неверные. Ждать viewDidAppear поздно: пользователь увидит прыжок.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.
Ещё по теме «UIKit»
- Неверная картинка в переиспользуемой ячейке
- Diffable data source и повторяющиеся идентификаторы
- Что делать в prepareForReuse
- reconfigureItems и reloadItems
- Ячейки с автоматической высотой
- Content hugging и compression resistance
- Задача на Swift: разница снимков для diffable data source
- setNeedsLayout и layoutIfNeeded