Лекция 13 CS193P Winter 2017 — Timer и анимация.

На Лекции 13 рассматривается одна маленькая тема -таймер Time, и одна большая — анимация.
В начале Лекции 13 рассматривается очень простой маленький класс, таймер Time. Таймер — это просто способ выполнять блок кода снова и снова с некоторым периодом времени. В действительности мы не используем таймеры для анимации как таковой, но очень часто при выполнении анимации мы привлекаем иногда таймеры. 

Таймер — это не элемент системы программирования реального времени, и вы должны быть достаточно толерантны к тому, что выполнение замыканий не происходит точно по времени.

Таймер создан на основе специальной iOS технологию Run loops. Для  main queue система автоматически устанавливает  для вас Run loops, так что на main queue Timer работает всегда.
Пол Хэгерти представляет демонстрационный пример, в котором использует  приложение FaceIt, и заставляет в нем «лицо» «моргать глазами». Для этого создается subclass, в котором используются два вложенных друг в друга таймера. Но это еще не настоящая анимация.

Основная часть лекции посвящена анимации. Профессор делает небольшой обзор типов анимации, которые доступны в iOS, но фокусируется на анимации views (UIViews).


Одним из таких видов анимации является анимация свойств viewframetransform и alpha. Этот тип анимации подробно рассматривается на этой лекции и показывается простой и остроумный демонстрационный пример, когда наш «старый товарищ» — приложение FaceIt — не только действительно «моргает глазами», но и «трясет головой». Для этого используется метод класса UIView с именем transition(with:). В этом случае вы не ограничены такими специфическими свойствами, как alphaframe и transform, а можете переворачивать views, “растворять” одно в другом, перворачивать вверх /вниз. Все это делается с помощью методов класса  UIView и замыканий. И тут Пол Хэгерти не упускает случая объяснить нам синтаксические конструкции Swift: как lazy свойства помогают решить головоломку инициализации, как анимиривать процесс установки переменной var с помощью вычисляемого свойства с «хранением», ибо любимый им Наблюдатель свойства didSet{} происходит слишком поздно для анимации процесса установки; когда использовать метод layoutSubviews (), а когда viewDidLayoutSubviews ().

Другой вид анимации views — это Dynamic animation (динамическая анимация), основанная на “физических” взаимодействиях анимируемых объектов. Эта анимация очень интересная и очень простая в использовании. Чтобы изучить все APIs динамического движка Dynamic Animation, основанного на физических принципах. На Лекции 13 перед вами предстают теоретические основы и принципы работы движка Dynamic Animation, а  на Лекции 14 Пол Хэгерти в своем демонстрационном примере игру Asteroids.

Аниматор

Сначала создается аниматор, действующий в пределах игровой зоны, представляющей собой UIView. В силу определенных причин используется lazy сценарий его инициализации.

«Поведения»

Затем к аниматору добавляется одно или несколько поведений  UIDynamicBehaviors, такие как gravity (гравитация), collisions (столкновения) и динамические элементы, подсоединенные ( attached) друг к другу . В основном, это описание того, как  будут себя вести эти элементы, основываясь на их физических свойствах. И опять используется lazy версия инициализации.

Рассматриваются почти все виды поведения : гравитация (gravity), столкновения (collision), привязывание (attachment), толкание (push), моментальный снимок (snap)  и другие. Изучается механизм композиции сложного поведения из простых элементов.

Динамические объекты

Они добавляются к “поведению”, а «поведение» — к аниматору.
Любые анимирующие объекты должны реализовать UIDynamic протокол. Динамические объекты можно наделить «мета поведением» —  density (плотностью), resistance (сопротивлением), elasticity (упругость), friction (трение) и  rotation (вращение) и другими. Это будет влиять на взаимодействие объектов в физической среде.

Очень важное свойство класса UIDynamicBehavior называется action. Этот фрагмент кода будет выполняться каждый раз, когда “поведение” будет воздействовать на свои  динамические объекты. На лекции рассматривается необычный способ удаления «поведения» толкание (push), когда используя возможности action, оно удаляет само себя. При этом этом показано как избежать циклических блокировок памяти в  action.

Лекции и слайды на английском языке представлены в iTunes название “13.  Timer and Animation”. Код демонстрационного примера «L13 Faceit» доступен на Github.

Русскоязычный неавторизованный конспект Лекции 13, хронометрированный через каждые 5 минут, и представленный в виде PDF-файла, который можно скачать и использовать offline, а также Google Doc доступны на платной основе.