Какой метод UIViewController, кроме viewWillLayoutSubviews, гарантированно предоставляет окончательные размеры view для позиционирования элементов?

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

Ответ

Основной метод — viewDidLayoutSubviews().

Почему он предпочтительнее viewWillLayoutSubviews?

  • В viewDidLayoutSubviews() гарантировано, что все вычисления Auto Layout завершены и все сабвью имеют свои окончательные (final) размеры (bounds, frame).
  • viewWillLayoutSubviews() вызывается перед вычислением лэйаута. Размеры вью и её сабвью здесь могут быть неактуальными или промежуточными.

Пример позиционирования:

override func viewDidLayoutSubviews() {
    super.viewDidLayoutSubviews()
    // Безопасно используем окончательные размеры
    let side = min(view.bounds.width, view.bounds.height) * 0.8
    centeredView.frame = CGRect(
        x: (view.bounds.width - side) / 2,
        y: (view.bounds.height - side) / 2,
        width: side,
        height: side
    )
}

Альтернативы для кастомных UIView:

  • layoutSubviews() — аналог для UIView. Здесь также можно позиционировать сабвью, опираясь на окончательный bounds.
  • Использование Auto Layout констрейнтов — наиболее декларативный и правильный способ, который не требует ручного вызова этих методов.