DevPrep

Все темы › Auto Layout

Опишите цикл раскладки: setNeedsLayout, layoutSubviews, updateConstraints.

Senior PRO

Три фазы и их направление

Цикл выполняется на каждом проходе run loop перед отрисовкой кадра (в CATransaction commit), только для view, помеченных «грязными».

  1. Update constraints — проход снизу вверх (от листьев к корню). Вызывается updateConstraints() у view, для которых был setNeedsUpdateConstraints(). Это место, где вы пакетно меняете/создаёте констрейнты; саму систему уравнений решает движок. Apple рекомендует переопределять updateConstraints только для производительности, когда изменений много; в обычных случаях констрейнты меняют прямо там, где произошло событие.
  2. Layout — проход сверху вниз (от корня к листьям). Движок решает систему и вызывает layoutSubviews(): view получает свой frame и расставляет subviews. setNeedsLayout() помечает view на следующий проход, layoutIfNeeded() выполняет layout немедленно (так работает анимация констрейнтов). У контроллера вокруг этого — viewWillLayoutSubviews / viewDidLayoutSubviews.
  3. Display — проход сверху вниз. setNeedsDisplay() помечает слой, и вызывается draw(_:) / display(_:). Изменение frame не вызывает перерисовку автоматически, если contentMode не .redraw.

Продолжение ответа с кодом и уточняющими вопросами интервьюера — в приложении DevPrep.

Полный ответ — в DevPrep

Потренируйтесь перед собеседованием

В DevPrep эти ответы превращаются в задачи на минуту: что напечатает код, найди баг, пробное собеседование. По задаче в день.

Скачать DevPrep в App Store