Вопрос проверяет, понимает ли разработчик, когда можно безопасно использовать размеры view и не ловить баги из-за незавершённого layout.
Финальные размеры frame и bounds гарантированно известны в viewDidLayoutSubviews. К этому моменту Auto Layout уже отработал и система применила все изменения геометрии. В более ранних методах размеры могут быть временными или нулевыми. Поэтому вся логика, зависящая от точных размеров, должна выполняться после layout.
Размеры view в UIKit становятся корректными не сразу, а только после прохождения layout-процесса. Это критично понимать при работе с Auto Layout.
На разных этапах жизненного цикла размеры могут быть:
CGRect.zero
значениями “по умолчанию”
устаревшими (до перерасчёта констрейнтов)
Например:
в viewDidLoad layout ещё не выполнялся
в viewWillAppear layout может быть не завершён
Единственный метод контроллера, где:
layout уже завершён
frame и bounds актуальны
это viewDidLayoutSubviews.
В viewDidLayoutSubviews:
Auto Layout применил все констрейнты
учтены safe area и inset’ы
размеры соответствуют реальному положению на экране
Это делает метод идеальным для:
вычисления размеров ячеек
настройки кастомных слоёв
позиционирования элементов относительно друг друга
Иногда размеры также корректны:
после layoutIfNeeded()
внутри UIView.layoutSubviews()
но для UIViewController именно viewDidLayoutSubviews считается безопасной точкой.
Если логика зависит от реальных размеров view — выполняй её в viewDidLayoutSubviews. Любое более раннее место — потенциальный источник нестабильных багов.