Ответ
Метод viewWillLayoutSubviews() вызывается у UIViewController непосредственно перед тем, как система автоматически расставит (layout) все его subviews с помощью Auto Layout или frame-based вычислений.
Основное назначение: Внесение последних изменений в геометрию или констрейнты перед финальным вычислением лейаута системой. Это последний шанс скорректировать фреймы, констрейнты или свойства, влияющие на размер.
override func viewWillLayoutSubviews() {
super.viewWillLayoutSubviews()
// У view уже есть актуальные bounds (например, после поворота)
if view.bounds.width > 768 {
sidebarWidthConstraint.constant = 300
} else {
sidebarWidthConstraint.constant = 100
}
// Здесь можно вручную изменить frame, если не используется Auto Layout
// headerView.frame = CGRect(x: 0, y: 0, width: view.bounds.width, height: 80)
}
Важные нюансы:
- Вызывается многократно — при повороте, изменении размера, добавлении/удалении subview, обновлении констрейнтов, скролле и т.д.
- Не для тяжелых вычислений — из-за частых вызовов здесь не следует выполнять дорогие операции.
- Для однократной настройки используйте
viewDidLoad(). - Для кода после лейаута — используйте
viewDidLayoutSubviews().