Ответ
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().