Для чего нужен метод viewWillLayoutSubviews в UIKit?

«Для чего нужен метод viewWillLayoutSubviews в UIKit?» — вопрос из категории UIKit, который задают на 10% собеседований IOS Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Метод 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)
}

Важные нюансы:

  1. Вызывается многократно — при повороте, изменении размера, добавлении/удалении subview, обновлении констрейнтов, скролле и т.д.
  2. Не для тяжелых вычислений — из-за частых вызовов здесь не следует выполнять дорогие операции.
  3. Для однократной настройки используйте viewDidLoad().
  4. Для кода после лейаута — используйте viewDidLayoutSubviews().