Что такое анимация в iOS
Что проверяют
Понимаете ли вы, что за UIView.animate стоит Core Animation, и знаете ли про разделение модельного и отображаемого слоя.
Как отвечать
Анимация в iOS это плавное изменение свойств во времени, и почти всё в итоге выполняет Core Animation.
Уровни, от простого к низкому:
UIView.animate: блочный API. В блоке задаются конечные значения анимируемых свойств (frame,bounds,center,alpha,transform,backgroundColor), система сама строит переход. Есть пружинный вариант с жёсткостью и затуханием;UIViewPropertyAnimator: то же, но с управлением. Анимацию можно приостановить, перемотать пальцем, развернуть, изменить на лету. Нужен для интерактивных переходов;- Core Animation напрямую:
CABasicAnimation,CAKeyframeAnimation,CAAnimationGroupна уровне слоёв. Даёт то, чего нет у представлений: анимацию пути, маски, тени, контура фигуры; - SwiftUI:
withAnimation, модификатор.animation(_:value:), переходы появления и исчезновения,matchedGeometryEffectдля перелёта элемента между экранами.
Главное, что стоит назвать: у слоя есть модельный и отображаемый слой. Свойство меняется мгновенно в модели, а на экране интерполируется отображаемая копия. Отсюда классическая ловушка: во время перелёта кнопки нажатие обрабатывается по её конечному положению, потому что попадание проверяется по модели. Решение это отключение взаимодействия на время анимации или проверка по presentation().
Второе важное: анимации исполняет отдельный процесс отрисовки, поэтому они продолжают идти плавно, даже если основной поток занят. Но только для анимируемых свойств: перерасчёт разметки и рисование своим кодом останутся на основном потоке.
Про производительность: анимировать transform и opacity дёшево, менять разметку дорого; тени, маски и скруглённые углы с обрезкой вызывают отрисовку вне экрана, и это первое, что смотрят при пропущенных кадрах.
Где спотыкаются
Меняют ограничения разметки внутри блока анимации без вызова обновления разметки.
Ждут, что нажатия будут работать по видимой позиции.
Ставят shouldRasterize наугад и делают хуже.
Не отменяют анимацию при переиспользовании ячейки списка.