Вопрос проверяет понимание внутренних затрат Auto Layout и умение выявлять узкие места в производительности UI.
Auto Layout может негативно влиять на производительность, когда используется в сложных и часто обновляемых иерархиях. Частые изменения констрейнтов, глубокие деревья view и layout в каждом кадре приводят к дорогим перерасчётам. Особенно заметно это в списках, анимациях и при скролле. В таких местах Auto Layout требует аккуратного использования или замены.
Auto Layout удобен и безопасен, но его универсальность имеет цену. Эта цена проявляется в моментах, когда система вынуждена часто и много пересчитывать геометрию.
Auto Layout:
строит систему ограничений
решает её как набор линейных уравнений
делает это при каждом layout-проходе
При небольшом UI это незаметно, но при росте сложности затраты нарастают нелинейно.
Чем больше уровней вложенности:
тем больше констрейнтов участвует в расчёте
тем шире область invalidation
Даже небольшое изменение внизу иерархии может вызвать перерасчёт большого фрагмента UI.
Особенно опасны ситуации, когда:
констрейнты меняются в ответ на скролл
layout обновляется в анимациях
размеры меняются каждый кадр
Пример плохого сценария:
изменение constraint внутри scrollViewDidScroll
изменение constraint внутри viewDidLayoutSubviews
В UITableView и UICollectionView Auto Layout может:
пересчитываться при каждом reuse
пересчитываться при каждом изменении контента
вызывать systemLayoutSizeFitting для расчёта высоты
Это особенно дорого при:
self-sizing cells
сложных ячейках с вложенными stack view
UIStackView сам не рисуется, но:
активно управляет констрейнтами
добавляет и удаляет их при каждом изменении
Несколько вложенных stack view могут:
кратно увеличить количество констрейнтов
сильно замедлить layout
Если анимация:
меняет constraints
вызывает layout каждый кадр
то Auto Layout может стать bottleneck’ом и вызвать dropped frames.
Типовые симптомы:
фризы при скролле
скачки FPS
частые вызовы layoutSubviews и updateConstraints
Инструменты:
Time Profiler
Core Animation FPS
Auto Layout logs (Unsatisfiable constraints)
Auto Layout начинает вредить производительности там, где UI часто и динамически меняется. В таких местах лучше минимизировать количество констрейнтов или использовать фреймовую верстку.