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
70
Sign In with Apple (client + server). Петр Третьяков
cocoaheads
0
250
Эволюция антипаттернов в Java и Kotlin. Михаил Горюнов
cocoaheads
0
160
Рефакторинг в условиях быстрорастущего стартапа. Егор Фесенко
cocoaheads
0
50
Make Experiments Great Again, или Как iOS Браузер А/Б тестирование улучшал
cocoaheads
0
99
Лотерея в приложении: отрисовка, анимация и никакого мошенничества
cocoaheads
0
82
SceneKit на практике
cocoaheads
0
120
Пишем под iOS на Flutter
cocoaheads
0
150
Выходные с Kotlin/Native
cocoaheads
0
72
Other Decks in Programming
See All in Programming
Rancher と Terraform
fufuhu
2
550
Ruby Parser progress report 2025
yui_knk
1
450
今だからこそ入門する Server-Sent Events (SSE)
nearme_tech
PRO
3
240
HTMLの品質ってなんだっけ? “HTMLクライテリア”の設計と実践
unachang113
4
2.9k
はじめてのMaterial3 Expressive
ym223
2
880
Zendeskのチケットを Amazon Bedrockで 解析した
ryokosuge
3
310
機能追加とリーダー業務の類似性
rinchoku
2
1.3k
go test -json そして testing.T.Attr / Kyoto.go #63
utgwkk
3
310
そのAPI、誰のため? Androidライブラリ設計における利用者目線の実践テクニック
mkeeda
2
1.8k
OSS開発者という働き方
andpad
5
1.7k
ファインディ株式会社におけるMCP活用とサービス開発
starfish719
0
1.9k
「手軽で便利」に潜む罠。 Popover API を WCAG 2.2の視点で安全に使うには
taitotnk
0
870
Featured
See All Featured
Product Roadmaps are Hard
iamctodd
PRO
54
11k
GitHub's CSS Performance
jonrohan
1032
460k
Put a Button on it: Removing Barriers to Going Fast.
kastner
60
4k
Typedesign – Prime Four
hannesfritz
42
2.8k
How to train your dragon (web standard)
notwaldorf
96
6.2k
Templates, Plugins, & Blocks: Oh My! Creating the theme that thinks of everything
marktimemedia
31
2.5k
Why You Should Never Use an ORM
jnunemaker
PRO
59
9.5k
実際に使うSQLの書き方 徹底解説 / pgcon21j-tutorial
soudai
PRO
188
55k
Designing for humans not robots
tammielis
253
25k
個人開発の失敗を避けるイケてる考え方 / tips for indie hackers
panda_program
113
20k
Java REST API Framework Comparison - PWX 2021
mraible
33
8.8k
How to Think Like a Performance Engineer
csswizardry
26
1.9k
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