Выбор ответа Middle UIKit обновлено

setNeedsLayout и layoutIfNeeded

Вопрос

Как анимировать изменение констрейнта?

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: Изменить constant, затем в animate вызвать layoutIfNeeded(). setNeedsLayout лишь помечает view к раскладке на следующем цикле обновления, анимационный блок к тому моменту уже закрыт. layoutIfNeeded выполняет раскладку немедленно, поэтому новые фреймы считаются внутри анимационного блока и…

Варианты ответа

  1. Вызвать setNeedsLayout() внутри блока UIView.animate
  2. Изменить constant внутри UIView.animate без других вызовов
  3. Изменить constant, затем в animate вызвать layoutIfNeeded()правильный ответ
  4. Удалить и заново создать констрейнт в viewDidAppear

Разбор

setNeedsLayout лишь помечает view к раскладке на следующем цикле обновления, анимационный блок к тому моменту уже закрыт. layoutIfNeeded выполняет раскладку немедленно, поэтому новые фреймы считаются внутри анимационного блока и анимируются. Изменение constant само по себе только помечает раскладку как устаревшую. Пересоздавать констрейнты для анимации не нужно.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.