Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Микроинтеракции в iOS
Search
CocoaHeads
September 29, 2018
Programming
0
220
Микроинтеракции в iOS
CocoaHeads
September 29, 2018
Tweet
Share
More Decks by CocoaHeads
See All by CocoaHeads
Тесты: Повторение. Виктор Суриков
cocoaheads
0
68
Sign In with Apple (client + server). Петр Третьяков
cocoaheads
0
240
Эволюция антипаттернов в Java и Kotlin. Михаил Горюнов
cocoaheads
0
160
Рефакторинг в условиях быстрорастущего стартапа. Егор Фесенко
cocoaheads
0
47
Make Experiments Great Again, или Как iOS Браузер А/Б тестирование улучшал
cocoaheads
0
94
Лотерея в приложении: отрисовка, анимация и никакого мошенничества
cocoaheads
0
78
SceneKit на практике
cocoaheads
0
110
Пишем под iOS на Flutter
cocoaheads
0
140
Выходные с Kotlin/Native
cocoaheads
0
71
Other Decks in Programming
See All in Programming
『リコリス・リコイル』に学ぶ!! 〜キャリア戦略における計画的偶発性理論と変わる勇気の重要性〜
wanko_it
1
480
Claude Code と OpenAI o3 で メタデータ情報を作る
laket
0
130
The State of Fluid (2025)
s2b
0
120
decksh - a little language for decks
ajstarks
4
21k
0から始めるモジュラーモノリス-クリーンなモノリスを目指して
sushi0120
0
280
PHPカンファレンス関西2025 基調講演
sugimotokei
6
1.1k
[DevinMeetupTokyo2025] コード書かせないDevinの使い方
takumiyoshikawa
2
280
抽象化という思考のツール - 理解と活用 - / Abstraction-as-a-Tool-for-Thinking
shin1x1
1
960
Bedrock AgentCore ObservabilityによるAIエージェントの運用
licux
9
610
管你要 trace 什麼、bpftrace 用下去就對了 — COSCUP 2025
shunghsiyu
0
380
構文解析器入門
ydah
7
2.1k
Android 15以上でPDFのテキスト検索を爆速開発!
tonionagauzzi
0
200
Featured
See All Featured
Docker and Python
trallard
45
3.5k
Side Projects
sachag
455
43k
実際に使うSQLの書き方 徹底解説 / pgcon21j-tutorial
soudai
PRO
183
54k
Being A Developer After 40
akosma
90
590k
VelocityConf: Rendering Performance Case Studies
addyosmani
332
24k
Faster Mobile Websites
deanohume
308
31k
Build The Right Thing And Hit Your Dates
maggiecrowley
37
2.8k
Fashionably flexible responsive web design (full day workshop)
malarkey
407
66k
Six Lessons from altMBA
skipperchong
28
3.9k
Designing for humans not robots
tammielis
253
25k
Building an army of robots
kneath
306
45k
Improving Core Web Vitals using Speculation Rules API
sergeychernyshev
18
1.1k
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