В каком методе жизненного цикла UIViewController следует устанавливать Auto Layout constraints?

Ответ

Constraints обычно устанавливают в viewDidLoad(). Для динамических обновлений используют viewDidLayoutSubviews() или updateViewConstraints().

Рекомендации по выбору метода:

  • viewDidLoad() — основной метод для первоначальной настройки статических constraints. Вью загружена, но её размеры ещё не определены.
  • viewDidLayoutSubviews() — если constraints зависят от окончательных размеров вью (например, нужно выровнять элемент относительно центра). Вызывается несколько раз (при повороте, изменении размера).
  • updateViewConstraints() — для сложной, изменяемой логики constraints. Система вызывает его при необходимости обновить layout.

Пример установки в viewDidLoad():

override func viewDidLoad() {
    super.viewDidLoad()
    let redView = UIView()
    redView.backgroundColor = .red
    view.addSubview(redView)

    redView.translatesAutoresizingMaskIntoConstraints = false
    NSLayoutConstraint.activate([
        redView.centerXAnchor.constraint(equalTo: view.centerXAnchor),
        redView.centerYAnchor.constraint(equalTo: view.centerYAnchor),
        redView.widthAnchor.constraint(equalToConstant: 100),
        redView.heightAnchor.constraint(equalToConstant: 100)
    ])
}

Важно: Избегайте установки constraints в loadView(), viewWillAppear(_:) или viewDidAppear(_:), чтобы не вызывать лишние операции расчёта layout.

Ответ 18+ 🔞

А, ну это про констрейнты, да? Ну, блядь, классика жанра! Смотри, тут как с унитазом — если наебнуться с выбором места, потом весь пол зальёшь, сука.

Вот смотри, обычно их пихают в viewDidLoad(). Это как базовая расстановка мебели в новой квартире — вьюха загрузилась, но где точно будут стены, ещё нихуя не ясно. Статику, недвижимость всякую — туда.

А если тебе надо подогнать размеры уже под реальные габариты, когда вьюха уже отрисовалась и понятно, где что, то это viewDidLayoutSubviews(). Он, этот ушлёпок, вызывается по несколько раз — повернул экран, размер изменился — оп, он тут как тут. Тут уже можно ровнять по центру, относительно других элементов, которые уже заняли своё место.

Ну а updateViewConstraints() — это уже для сложных, ебучных случаев, когда логика констрейнтов меняется динамически, на ходу. Система сама его дергает, когда понимает, что пора всё пересчитать. Вмешивайся, если реально надо.

Главное, сука, запомни: Не лезь со своими констрейнтами в loadView(), viewWillAppear(_:) или viewDidAppear(_:). Это как начать переставлять диван, когда гости уже пришли — лишние телодвижения, система будет пересчитывать лэйаут без всякой на то причины, и всё начнёт тормозить и глючить. Пиздец, а не разработка.

Вот тебе пример, как обычно делают в viewDidLoad():

override func viewDidLoad() {
    super.viewDidLoad()
    let redView = UIView()
    redView.backgroundColor = .red
    view.addSubview(redView)

    redView.translatesAutoresizingMaskIntoConstraints = false
    NSLayoutConstraint.activate([
        redView.centerXAnchor.constraint(equalTo: view.centerXAnchor),
        redView.centerYAnchor.constraint(equalTo: view.centerYAnchor),
        redView.widthAnchor.constraint(equalToConstant: 100),
        redView.heightAnchor.constraint(equalToConstant: 100)
    ])
}

Всё, красный квадратик по центру. Просто, как три копейки. Главное — translatesAutoresizingMaskIntoConstraints = false не забудь, а то получишь ебучую ошибку, и будешь потом полдня искать, в чём дело. Ядрёна вошь!