Какие методы участвуют в процессе layout UIView
Что проверяют
Понимаете ли вы цикл разметки: что просто помечает вью грязным, что запускает пересчёт, что вызывает система, а что можно звать самому. Следом почти гарантированно спросят разницу между setNeedsLayout() и layoutIfNeeded() и как анимировать изменение констрейнта.
Как отвечать
Скажите главное: разметка происходит не сразу, а на проходе цикла событий, и делится на три фазы. Сначала обновление констрейнтов снизу вверх, от подвью к корню, потом расстановка кадров сверху вниз, потом отрисовка. Дальше по методам:
setNeedsLayout(): помечает, что разметка устарела. Дешёвый, много вызовов схлопываются в одну работу в конце цикла;layoutIfNeeded(): пересчитывает немедленно, если флаг стоит. Нужен, когда результат требуется прямо сейчас;layoutSubviews(): точка расширения, куда система передаёт управление. Вызывать напрямую нельзя, вызыватьsuperобязательно;updateConstraints()вместе сsetNeedsUpdateConstraints()иupdateConstraintsIfNeeded(): массовое пересоздание констрейнтов. Для смены одногоconstantэтот механизм лишний, меняйте значение сразу;intrinsicContentSizeиinvalidateIntrinsicContentSize(): собственный размер по контенту, работает в паре с приоритетами content hugging и compression resistance;systemLayoutSizeFitting(_:),sizeThatFits(_:),sizeToFit(): посчитать размер вне обычного прохода, это основа саморазмерных ячеек;- у контроллера:
viewWillLayoutSubviews()иviewDidLayoutSubviews(), единственное надёжное место, гдеboundsуже верный.
Закончите практикой анимации: меняете constant, затем внутри UIView.animate зовёте layoutIfNeeded() на общем родителе, и переход проигрывается плавно.
Где спотыкаются
Вызывают layoutSubviews() напрямую или забывают super. В первом случае вы обходите механизм пометок, во втором ломаете разметку системных вью внутри.
Расставляют frame вручную при активных констрейнтах. Auto Layout на следующем проходе перепишет всё обратно, и баг выглядит мистикой.
Зовут setNeedsLayout() изнутри layoutSubviews(), получая бесконечный цикл разметки и просадку до нескольких кадров в секунду.