Ответ
Окончательные, актуальные размеры корневой вью (view.bounds) становятся известны в методе viewDidLayoutSubviews().
Почему именно здесь? Этот метод вызывается после того, как система:
- Рассчитала layout для всех subviews (включая корневую вью).
- Установила их окончательные frame (размеры и положение).
Особенности метода:
- Многократный вызов: Вызывается при каждом изменении layout (поворот устройства, изменение размера, обновление constraints).
- Используйте флаги для кода, который должен выполниться только при первом layout.
Пример получения размера вью:
private var isInitialLayoutDone = false
override func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
// Получаем окончательный размер корневой вью
let viewSize = view.bounds.size
print("View size: (viewSize)")
// Код для однократного выполнения после первого layout
if !isInitialLayoutDone {
isInitialLayoutDone = true
configureInitialLayoutBasedOnSize(viewSize)
}
}
Важно: В viewDidLoad() и viewWillAppear(_:) размеры вью могут быть неверными (например, равными размеру экрана в Storyboard, а не реальному).