В каком методе жизненного цикла UIViewController происходит пересчёт и обновление Auto Layout constraints?

Ответ

Пересчёт и обновление constraints происходит в методе updateViewConstraints(). Это специализированный метод жизненного цикла, который система вызывает при необходимости обновить layout.

Как это работает:

  1. Вы вызываете setNeedsUpdateConstraints() для вью, чтобы запланировать обновление.
  2. Система вызывает updateViewConstraints() в следующем цикле обновления layout.
  3. Внутри метода вы добавляете, изменяете или удаляете constraints.

Пример использования:

override func updateViewConstraints() {
    // 1. Удаляем старые constraints (если нужно)
    NSLayoutConstraint.deactivate(oldConstraints)

    // 2. Создаём и активируем новые constraints
    newConstraints = [
        myView.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor)
    ]
    NSLayoutConstraint.activate(newConstraints)

    // 3. ВСЕГДА вызываем super в конце метода
    super.updateViewConstraints()
}

Важные правила:

  • Не вызывайте updateViewConstraints() напрямую. Используйте setNeedsUpdateConstraints() для планирования обновления.
  • Всегда вызывайте super.updateViewConstraints() в конце реализации.
  • Метод работает в связке с viewWillLayoutSubviews() и viewDidLayoutSubviews(), формируя полный цикл обновления layout.

Ответ 18+ 🔞

Э, слушай, смотри, вот эта вся магия с версткой на констрейнтах. Есть у вьюхи такой метод, updateViewConstraints(). Это типа её личный ритуал, который система запускает, когда приспичило всё пересчитать и перетряхнуть.

Как эта штука, блядь, работает:

  1. Ты говоришь вьюхе: «Эй, сука, готовься, ща будем менять правила!» — вызываешь setNeedsUpdateConstraints().
  2. Система, такая: «Ага, поняла», и в следующем цикле верстки дёргает этот самый updateViewConstraints().
  3. А ты внутри уже, как царь и бог, хуячишь новые констрейнты, старые удаляешь — в общем, творишь свой беспредел.

Вот, смотри, как это выглядит в коде, чтоб не обосраться:

override func updateViewConstraints() {
    // 1. Старое говно — нахуй! (если надо, конечно)
    NSLayoutConstraint.deactivate(oldConstraints)

    // 2. Вешаем новые правила, как блядь хозяин
    newConstraints = [
        myView.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor)
    ]
    NSLayoutConstraint.activate(newConstraints)

    // 3. И ВСЕГДА, блядь, ВСЕГДА зовём супер в самом конце, а то накроется всё медным тазом!
    super.updateViewConstraints()
}

Главные правила, ёпта, чтобы не было пиздеца:

  • Не дёргай updateViewConstraints() руками, дурак! Только через setNeedsUpdateConstraints(), чтобы система сама решила, когда ей это удобно.
  • super.updateViewConstraints() — это святое. Забыл вызвать — получи ебучую нестабильную верстку и сиди потом дебажь, хитрая жопа.
  • Вообще, этот метод — часть большого цикла. Он там с viewWillLayoutSubviews() и viewDidLayoutSubviews() за ручку ходит, чтобы твой интерфейс не разъехался к ебеням.