Что оптимальнее для расчета лейаута в iOS: работа с фреймами или с Auto Layout
Что проверяют
Понимаете ли вы, чем на самом деле платите за Auto Layout, и умеете ли выбирать по замеру, а не по привычке. Ответ «фреймы всегда» и ответ «Auto Layout всегда» одинаково слабые: ждут разговора про цену и про сопровождение.
Как отвечать
По чистой скорости вычисления ручной расчёт дешевле: вы присваиваете готовые значения в layoutSubviews. Auto Layout решает систему ограничений, и стоимость растёт нелинейно с их числом и с глубиной иерархии, особенно в самоподстраивающихся ячейках списка, где размер считается до показа.
Практический ответ: по умолчанию Auto Layout, потому что он бесплатно даёт то, что вручную придётся писать и поддерживать самому: безопасные области, поворот, разные размеры экранов, системный масштаб шрифта, зеркальную раскладку для языков справа налево, анимацию изменения ограничений. Ручной лейаут применяется точечно: горячая ячейка длинного списка, свой контейнер со сложной геометрией, отрисовка, где расчёт всё равно нужен собственный.
Дальше покажите, что решение принимается по данным: профилировщик, замер времени подготовки ячейки, счётчик перерисовок. Если время действительно уходит в решатель, переписывается этот экран, а не весь проект.
- менять
constantу существующего ограничения дешевле, чем пересоздавать ограничения; - высоту ячейки, если она считается тяжело, стоит кэшировать;
- вложенные стеки удобны, но каждый уровень добавляет связи в систему.
Где спотыкаются
Объявляют фреймы быстрее и на этом останавливаются. Без замера это гадание: на обычном экране разница незаметна, а в списке решающими оказываются прозрачность, тени, декодирование картинок и работа в главном потоке.
Второе: выбирают ручной расчёт и теряют то, что раньше работало само. Интерфейс перестаёт переживать увеличенный системный шрифт, вырез экрана и зеркальную раскладку, и это всплывает уже в отзывах пользователей.
Третье: путают медленный лейаут с конфликтами. Неоднозначная система, ограничения, добавляемые заново на каждой переиспользуемой ячейке, приоритеты сжатия и растяжения по умолчанию дают и странный вид, и лишнюю работу решателя. Лечится это разбором конфликтов, а не отказом от Auto Layout.