Lock in $30 Savings on PRO—Offer Ends Soon! ⏳
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Микроинтеракции в iOS
Search
CocoaHeads
September 29, 2018
Programming
0
230
Микроинтеракции в iOS
CocoaHeads
September 29, 2018
Tweet
Share
More Decks by CocoaHeads
See All by CocoaHeads
Тесты: Повторение. Виктор Суриков
cocoaheads
0
79
Sign In with Apple (client + server). Петр Третьяков
cocoaheads
0
260
Эволюция антипаттернов в Java и Kotlin. Михаил Горюнов
cocoaheads
0
170
Рефакторинг в условиях быстрорастущего стартапа. Егор Фесенко
cocoaheads
0
59
Make Experiments Great Again, или Как iOS Браузер А/Б тестирование улучшал
cocoaheads
0
110
Лотерея в приложении: отрисовка, анимация и никакого мошенничества
cocoaheads
0
92
SceneKit на практике
cocoaheads
0
120
Пишем под iOS на Flutter
cocoaheads
0
150
Выходные с Kotlin/Native
cocoaheads
0
73
Other Decks in Programming
See All in Programming
S3 VectorsとStrands Agentsを利用したAgentic RAGシステムの構築
tosuri13
6
310
「コードは上から下へ読むのが一番」と思った時に、思い出してほしい話
panda728
PRO
38
26k
俺流レスポンシブコーディング 2025
tak_dcxi
14
8.7k
Developing static sites with Ruby
okuramasafumi
0
290
関数実行の裏側では何が起きているのか?
minop1205
1
700
非同期処理の迷宮を抜ける: 初学者がつまづく構造的な原因
pd1xx
1
720
AWS CDKの推しポイントN選
akihisaikeda
1
240
Rediscover the Console - SymfonyCon Amsterdam 2025
chalasr
2
160
안드로이드 9년차 개발자, 프론트엔드 주니어로 커리어 리셋하기
maryang
1
110
AtCoder Conference 2025「LLM時代のAHC」
imjk
2
480
まだ間に合う!Claude Code元年をふりかえる
nogu66
5
830
大体よく分かるscala.collection.immutable.HashMap ~ Compressed Hash-Array Mapped Prefix-tree (CHAMP) ~
matsu_chara
2
220
Featured
See All Featured
BBQ
matthewcrist
89
9.9k
Become a Pro
speakerdeck
PRO
31
5.7k
A better future with KSS
kneath
240
18k
Build The Right Thing And Hit Your Dates
maggiecrowley
38
3k
Keith and Marios Guide to Fast Websites
keithpitt
413
23k
Code Reviewing Like a Champion
maltzj
527
40k
Building Adaptive Systems
keathley
44
2.9k
The MySQL Ecosystem @ GitHub 2015
samlambert
251
13k
Why You Should Never Use an ORM
jnunemaker
PRO
61
9.6k
Performance Is Good for Brains [We Love Speed 2024]
tammyeverts
12
1.3k
Design and Strategy: How to Deal with People Who Don’t "Get" Design
morganepeng
132
19k
The Illustrated Children's Guide to Kubernetes
chrisshort
51
51k
Transcript
Антон Сергеев Микроинтеракции в iOS
None
Лоадер 3
Содержание 4 › Модель микроинтеракций › Микроинтеракции с помощью CAAction
› Примеры
Модель микроинтеракций
Модель, описывающая взаимодействие с приложением Модель микроинтеракций
7 Триггер Бизнес- логика Обратная связь Изменение состояния Модель микроинтеракций
8 Пользователь UX-Дизайнер Разработчик Модель микроинтеракций
Пользователь
10 Триггер Бизнес- логика Обратная связь Изменение состояния Пользователь
11 Триггер Бизнес- логика Обратная связь Изменение состояния Пользователь
12 Триггер Бизнес- логика Обратная связь Изменение состояния Пользователь
13 Триггер Бизнес- логика Обратная связь Изменение состояния Пользователь
UX-Дизайнер
15 Триггер Бизнес- логика Обратная связь Изменение состояния UX-Дизайнер
16 Триггер Бизнес- логика Обратная связь Изменение состояния UX-Дизайнер
17 Триггер Бизнес- логика Обратная связь Изменение состояния UX-Дизайнер
18 Триггер Бизнес- логика Обратная связь Изменение состояния UX-Дизайнер
Разработчик
20 Триггер Бизнес- логика Обратная связь Изменение состояния Разработчик
21 Триггер Бизнес- логика Обратная связь Изменение состояния Разработчик
22 Триггер Бизнес- логика Обратная связь Изменение состояния Разработчик
23 Триггер Бизнес- логика Обратная связь Изменение состояния Разработчик
Модель, описывающая взаимодействие с приложением Модель микроинтеракций
25 Триггер Бизнес- логика Обратная связь Изменение состояния Модель микроинтеракций
Микроинтеракции с помощью CAAction
Микроинтеракции с помощью CAAction 27 UIView CALayer как хранилище состояний
Действия CAAction
UIView
29 › UIView получает сообщения о касаниях › …и других
внешних событиях UIView
30 Триггер Бизнес- логика Обратная связь Изменение состояния UIView
31 › UIView сообщает о событиях делегатам › UIView рассылает
сообщения подписчикам UIView
32 Триггер Бизнес- логика Обратная связь Изменение состояния UIView
delegate UIView 33 UIView CALayer
CALayer как хранилище состояний
delegate CALayer как хранилище состояний 35 UIView CALayer Обновление хранилища
CALayer — ассоциативный массив CALayer как хранилище состояний
class CALayer: NSObject { override func setValue(_ value: Any?, forKey
key: String) } layer.setValue(true, forKey: “isActive”) CALayer как хранилище состояний
Поддержка стилей CALayer как хранилище состояний
class CALayer { var style: [AnyHashable: Any]? { get set
} } CALayer как хранилище состояний
class CALayer { func value(forKey key: String) -> Any? }
style.key ?? style.style.key ?? style.style.style.key … CALayer как хранилище состояний
41 Триггер Бизнес- логика Обратная связь Изменение состояния CALayer как
хранилище состояний
Действия CAAction
delegate Действия CAAction 43 UIView CALayer Обновление хранилища Запрос CAAction
protocol CAAction { func run(forKey event: String, object anObject: Any,
arguments dict: [AnyHashable : Any]?) } Действия CAAction
45 Примеры CAAction: › CAAnimation › NSNull Действия CAAction
extension UIView: CALayerDelegate { func action(for layer: CALayer, forKey event:
String) -> CAAction? { ... } } Действия CAAction
class CALayer { func action(forKey event: String) -> CAAction? {
let action = delegate.action(for: self, forKey: event) ?? actions[event] ?? style.actions[event] ?? style.style.actions[event] ?? ... CALayer.defaultAction(forKey: event) return action == NSNull() ? nil : action } } Действия CAAction
Примеры
Анимация хранимых свойств
Анимация хранимых свойств
view.backgroundColor = red { didSet { layer.backgroundColor = red }
} Анимация хранимых свойств
layer.backgroundColor { action = self.action(forKey: backgroundColor) self.storage.backgroundColor = red action.run(forKey:
backgroundColor, object: self, arguments: nil) } Анимация хранимых свойств
53 › В блоке анимации анимируется › Вне блока анимации
не анимируется Анимация хранимых свойств
extension UIView: CALayerDelegate { func action(for layer: CALayer, forKey event:
String) -> CAAction? { ... } } Действия CAAction
UIView вне блока анимации при поиске действия возвращает NSNull Анимация
хранимых свойств
class var inheritedAnimationDuration: TimeInterval Анимация хранимых свойств
class CALayer { func setValue(_ value: Any?, forKey key: String)
{ action = action(forKey: key) storage[key] = value action.run(forKey: key, object: self, arguments: nil) } } Анимация хранимых свойств
Анимация событий
Анимация событий
class CALayer { func setValue(_ value: Any?, forKey key: String)
{ action = action(forKey: key) storage[key] = value action.run(forKey: key, object: self, arguments: nil) } } Анимация событий
class CustomView { func activate() { action = layer.action(forKey: activate)
action.run(forKey: activate, object: layer, arguments: nil) } } Анимация событий
Лоадер
Лоадер 63
None
None
None
67 Триггер Бизнес- логика Обратная связь Изменение состояния CALayer как
хранилище состояний
None
class Loader: UIView { var isActive: Bool // activate, deactivate
var progress: Double // updateProgress // kCAOnOrderIn // kCAOnOrderOut } Лоадер
70 › 5 событий * 6 состояний = 30 CAAction
Лоадер
Сложная задача превратилась в набор простых Лоадер
Заключение
73 Триггер Бизнес- логика Обратная связь Изменение состояния Заключение
Используйте модель микроинтеракций
Используйте CAAction для реализации микроинтеракций
Антон Сергеев Команда Яндекс.Карты @antonsergeev88 Спасибо за внимание
P.S.:
P.S.: Ассоциативный массив 78 › CALayer › CAAnimation
P.S.: Блог Карт на Medium 79 medium.com/yandex-maps-ios