Чем метод `layoutIfNeeded()` отличается от `setNeedsLayout()` в UIKit?

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

Ответ

layoutIfNeeded() — это синхронный вызов, который немедленно запускает процесс перерасчета макета (layout pass) для view и её поддерева, применяя все ожидающие изменения констрейнтов и фреймов.

setNeedsLayout() — это асинхронный запрос, который лишь помечает view как нуждающуюся в обновлении макета. Сам перерасчет произойдет в следующем цикле обновления интерфейса.

Ключевое отличие: layoutIfNeeded() заставляет макет обновиться сейчас, а setNeedsLayout()позже.

Типичный use case — анимация изменений констрейнтов:

// 1. Изменяем констрейнт
heightConstraint.constant = 200
// 2. В блоке анимации вызываем layoutIfNeeded()
UIView.animate(withDuration: 0.3) {
    self.view.layoutIfNeeded() // Изменение анимируется
}

Важно:

  • Частые вызовы layoutIfNeeded() могут быть дорогими для производительности.
  • Метод обновляет только геометрию (layout), но не перерисовывает контент. За перерисовку отвечает setNeedsDisplay().