Сделав небольшой обзор различных типов анимации в iOS на прошлой Лекции 7, в Лекции 8 профессор фокусируется на 3-х механизмах анимации views (UIViews):
- анимации свойств UIView с помощью аниматора UIViewPropertyAnimator
- переходах ( transition(with:)) между различными views
- динамическом аниматоре Dynamic Animator, построенном на физике
Первые два механизма анимации используют замыкания, которые выполняются НЕМЕДЛЕННО. Им не требуется ни 5 секунд, ни 10 секунд, ни какое-то другое время для своего выполнения. Они выполняются НЕМЕДЛЕННО и имеют немедленное воздействие. Анимация — это только то, что видит пользователь. Пользователь видит, что анимация происходит 5 или 10 секунд, но в действительности она происходит мгновенно как только вы стартовали анимацию. Поэтому вы должны мыслить сразу в двух временных рамках. Именно это делает анимацию немного затруднительной, но, по существу, это очень простые механизмы анимации. Механизм динамической анимации Dynamic Animation, основанный на “физических” взаимодействиях анимируемых объектов, более сложный и состоит из 3-х шагов: аниматор animator, «поведения» behaviors, динамические объекты items, наделенные определенными «поведениями» .
Аниматор
Сначала создается аниматор, действующий в пределах игровой зоны, представляющей собой UIView. В силу определенных причин используется lazy сценарий его инициализации.
«Поведения»
Затем к аниматору добавляется одно или несколько поведений UIDynamicBehaviors, такие как gravity (гравитация), collisions (столкновения) и динамические элементы, подсоединенные ( attached) друг к другу . В основном, это описание того, как будут себя вести эти элементы, основываясь на их физических свойствах. И опять используется lazy версия инициализации. Рассматриваются почти все виды поведения : гравитация (gravity), столкновения (collision), привязывание (attachment), толкание (push), моментальный снимок (snap) и другие. Изучается механизм композиции сложного поведения из простых элементов.
Динамические объекты
Они добавляются к “поведению”, а «поведение» — к аниматору. Любые анимирующие объекты должны реализовать UIDynamic протокол. Динамические объекты можно наделить «мета поведением» — density (плотностью), resistance (сопротивлением), elasticity (упругость), friction (трение) и rotation (вращение) и другими. Это будет влиять на взаимодействие объектов в физической среде.Очень важное свойство класса UIDynamicBehavior называется action. Этот фрагмент кода будет выполняться каждый раз, когда “поведение” будет воздействовать на свои динамические объекты. На лекции рассматривается необычный способ удаления «поведения» «мгновенный толчок» (pushBehavior), когда используются возможности action для удаления самого себя. При этом показано как избежать циклических блокировок памяти в action.
Затем профессор показывает очень основательный демонстрационный пример усложненной версии игры Концентрация с игральными картами PlayingCard, в которой задействованы все 3 механизма анимации: transition, анимация свойств с помощью UIViewPropertyAnimator и динамический аниматор UIDynamicAnimator. Игра осложнена тем, что карты находятся в постоянном движении, давая пользователю «перевести дух» только, когда он выбрал какую-то карту. Но если карты не совпали, то они переворачиваются «обратной» стороной и получают новый «мгновенный толчок» push.
Создаются различные цепочки анимаций, показывается, как отлаживать анимацию, используя прием «замедления и быстрых кликов», который позволяет запускать одновременно сразу несколько анимаций и выявить некоторые накладки, которые могут при этом возникнуть. Исследуется вопрос использования вычисляемых переменных в замыканиях анимаций и как это может динамически расширять круг анимируемых объектов. Есть много других интересных нюансов выполнения анимаций в этом прекрасном, хотя на первый взгляд не очень сложном, демонстрационном примере.
Код демонстрационного примера для Лекции 8 находится на Github для iOS 11 и на Github для iOS 12 в папке PlayingCard L8. Лекция 8 и слайды на английском языке находятся на iTunes название “8. Animation.”
Русскоязычный неавторизованный конспект Лекции 8, хронометрированный через каждые 5 минут, и представленный в виде PDF-файла, который можно скачать и использовать offline, а также в формате Google Doc доступны на платной основе.