Что такое констрейнты в iOS и для чего они нужны?
Что проверяют
Умеете ли вы описывать экран правилами, а не координатами, и понимаете ли, что делает движок раскладки, когда правил не хватает или они противоречат друг другу. Это базовый навык: на нём держатся разные размеры экранов, поворот, динамический шрифт и локализация.
Как отвечать
Констрейнт это линейное уравнение между атрибутами двух вьюх вида first.attribute = multiplier * second.attribute + constant. Auto Layout собирает из всех констрейнтов систему и решает её, получая кадры. Набор должен однозначно задавать положение и размер по обеим осям, при этом размер может приходить из собственного содержимого элемента.
У каждого констрейнта есть приоритет от единицы до тысячи. Тысяча означает обязательный, у необязательных движок удовлетворяет то, что может, а при конфликте отбрасывает слабейший. Отсюда две настройки, про которые обычно и спрашивают дальше: сопротивление растяжению и сопротивление сжатию. Именно ими разводят две метки в одной строке, решая, какая ужмётся.
На практике: анкоры вместо ручных объектов, активация набором, обязательное отключение автоматических констрейнтов из старой модели авторазметки при создании вьюхи кодом, привязка к безопасной области, анимация через изменение constant с последующим перерасчётом раскладки.
Где спотыкаются
Забывают выключить генерацию констрейнтов из авторазметки для вьюхи, созданной кодом. Система добавляет свои жёсткие правила, они конфликтуют с вашими, и в логе появляется неразрешимая система, хотя описание раскладки само по себе верное.
Путают неоднозначную раскладку с конфликтной. Если правил не хватает, ошибки не будет вовсе, а кадр окажется произвольным; если правила противоречат, движок отбросит одно и напишет об этом. Диагностируются эти две беды по-разному, и лечатся тоже.
Оставляют все приоритеты обязательными и потом борются с расползающимся текстом фиксированной шириной. На длинной строке или другом языке такой экран ломается: правильный инструмент это приоритеты сжатия и растяжения, а не жёсткий размер.