В чем разница между setNeedsLayout и layoutIfNeeded в UIKit и когда что использовать?

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

Ответ

setNeedsLayout vs layoutIfNeeded:

Метод Действие Когда использовать
setNeedsLayout() Асинхронно помечает представление для обновления компоновки в следующем цикле run loop. При изменении констрейнтов или свойств, не требующих мгновенного отражения. Эффективно, так как объединяет несколько изменений в одном обновлении.
layoutIfNeeded() Синхронно и немедленно пересчитывает и применяет layout для представления и его поддерева. Когда обновление layout должно произойти сразу, например, внутри блока анимации для плавного изменения констрейнтов.

Практический пример с анимацией:

// 1. Изменяем констрейнт (layout не обновляется сразу)
topConstraint.constant = 100

// 2. Запускаем анимацию. Вызов layoutIfNeeded() внутри блока
// заставляет представление немедленно принять новый layout,
// и анимирует это изменение.
UIView.animate(withDuration: 0.3) {
    self.view.layoutIfNeeded() // Немедленное обновление для анимации
}

Типовой паттерн: Измените свойства → вызовите setNeedsLayout() → если нужно немедленное обновление (для анимации или получения актуального frame), затем вызовите layoutIfNeeded().