Что такое SnapKit и как с ним работать
Что проверяют
Знаете ли вы Auto Layout под обёрткой или только синтаксис замыканий. Следом обычно спрашивают, чем updateConstraints отличается от remakeConstraints и как анимировать изменение констрейнта.
Как отвечать
SnapKit это Swift-библиотека с DSL поверх Auto Layout, наследница Masonry из мира Objective-C. Под капотом она создаёт обычные NSLayoutConstraint, поэтому все правила Auto Layout (приоритеты, конфликты, неоднозначность) остаются в силе.
Базовый сценарий: сначала addSubview, потом констрейнты:
avatar.snp.makeConstraints { $0.top.leading.equalToSuperview().inset(16); $0.size.equalTo(48) }
Флаг translatesAutoresizingMaskIntoConstraints библиотека выключает сама. Методы, которые стоит знать:
makeConstraints: добавляет новые констрейнты к существующим, повторный вызов создаст дубли;updateConstraints: меняет только константы у уже созданных констрейнтов с тем же атрибутом, отношением и вторым элементом;remakeConstraints: удаляет все констрейнты, созданные SnapKit для этой вью, и строит заново. Нужен, когда меняется сама схема раскладки;- ссылка на констрейнт:
topConstraint = $0.top.equalToSuperview().constraint, затемtopConstraint?.update(offset: 20),deactivate(),activate(); - модификаторы:
offset,inset,multipliedBy,priority(.high),lessThanOrEqualTo, привязка кsafeAreaLayoutGuide; labeled(_:): подпись, которая попадёт в лог конфликта констрейнтов.
Анимация: поменять константу, затем в UIView.animate вызвать layoutIfNeeded() у общего супервью.
Альтернативы: нативные якоря с NSLayoutConstraint.activate([...]) почти так же кратки и не требуют зависимости, а новые экраны многие пишут на SwiftUI.
Где спотыкаются
Вызывают makeConstraints в layoutSubviews или при каждой конфигурации ячейки. Констрейнты копятся, в консоли сыпятся конфликты, скролл тормозит.
Через updateConstraints пытаются привязать вью к другому соседу. Совпадающего констрейнта нет, и приложение падает: здесь нужен remakeConstraints.
Создают констрейнты до addSubview. Общего предка у вью нет, и SnapKit падает с fatal error при первом же открытии экрана.