Лекция 13 CS193P Spring 2016 — NSTimer и анимация.

На Лекции 13 рассматривается одна маленькая тема -таймер NSTime, и одна большая — анимация.  
В начале Лекции 13 рассматривается очень простой маленький класс, NSTime, который позволяет вам вызывать метод либо периодически — снова и снова через определенный интервал, либо один раз когда-нибудь в будущем.Таймер создан на основе специальной iOS технологию Run loopsДля  main queue система автоматически устанавливает  для вас Run loops, так что на main queue NSTimer работает всегда.
Пол Хэгерти представляет демонстрационный пример, в котором использует  приложение FaceIt, и заставляет в нем «лицо» «моргать глазами» с помощью двух таймеров NSTime, перекрестно вызывающих друг друга, что выглядит менее «роботизированно», чем если бы использовался один повторяющийся таймер. По ходу дела он рассказывает что такое в Swift метод,  доступный Objective-C на этапе run time, потому что именно такой метод запускает NSTime. А также показывает, как создать Actions и Outlets в superclass.

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


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

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

Аниматор

Сначала создается аниматор, действующий в пределах игровой зоны, представляющей собой 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. NSTimer and Animation”.   Код демонстрационного примера «FaceIt L13» для Swift 3.0  и Xcode 8 код находится на Github, а для Swift 3 .2  и Xcode 9 — также на Github..
Русскоязычный неавторизованный конспект Лекции 13, хронометрированный через каждые 5 минут, и представленный в виде PDF-файла, который можно скачать и использовать offline, а также Google Doc доступны на платной основе.