Как работает Auto Layout
Auto LayoutiOSбиблиотекиразработка под iOSфреймворки
Что проверяют
Понимаете ли вы, что Auto Layout это решатель системы линейных ограничений, а не набор правил «прижать к краю», и умеете ли разбирать конфликты.
Как отвечать
- Каждое ограничение это равенство или неравенство вида
item1.attribute1 = multiplier * item2.attribute2 + constant. Движок (наследник алгоритма Cassowary) на проходе разметки решает систему и выставляет фреймы вьюх. - Набор должен быть однозначным: по каждой оси нужны позиция и размер. Недостаток даёт ambiguous layout, противоречие даёт unsatisfiable constraints: система ломает одно ограничение и печатает лог.
- Приоритеты от 1 до 1000,
requiredэто 1000. Конфликт двух обязательных ограничений по приоритету не разрешается, он ломается, поэтому поведением управляют необязательными приоритетами (defaultHigh750,defaultLow250). - У контентных вьюх (label, кнопка, image view) есть
intrinsicContentSize, который спорит с растяжением через две пары приоритетов: content hugging (не хочет растягиваться) и compression resistance (не хочет сжиматься). Ими решается, какой из двух лейблов обрежется.
label.translatesAutoresizingMaskIntoConstraints = false
NSLayoutConstraint.activate([
label.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor, constant: 16),
label.leadingAnchor.constraint(equalTo: view.leadingAnchor, constant: 20)
])- В коде удобнее
NSLayoutAnchorиactivate, привязка кsafeAreaLayoutGuide, группировка черезUIStackView. Анимация меняетconstantу сохранённой ссылки на ограничение, дальшеlayoutIfNeeded()в блоке анимации.
Где спотыкаются
Забывают translatesAutoresizingMaskIntoConstraints = false для вьюх из кода и получают конфликт с ограничениями из autoresizing mask.
Гасят предупреждение, понижая приоритет наугад, вместо того чтобы прочитать лог: там перечислены конфликтующие ограничения, а в Xcode есть View Debugger.
Путают content hugging и compression resistance, и в ячейке обрезается не тот лейбл.
Говорят про пиксели. Ограничения задаются в поинтах, а сколько это в пикселях, зависит от масштаба экрана.