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