Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
iOS・Androidで使える デザインシステムをどう実装するか
Search
ああうえ
September 17, 2021
5.9k
3
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
iOS・Androidで使える デザインシステムをどう実装するか
iOSDC 2021
https://fortee.jp/iosdc-japan-2021/proposal/ddb7719b-3440-46ee-8a58-0d8a163bc6f8
ああうえ
September 17, 2021
More Decks by ああうえ
See All by ああうえ
メモリ不足との戦い〜大量データを扱うアプリでの実践例〜
kwzr
1
2.2k
iOS Apple Dev Tutorialsとpointfreeのモダン実装を比較する
kwzr
1
590
エンジニアとデザイナーがわかる iPadの画面サイズ対応入門
kwzr
0
210
react-reconcilerでオレオレReact Nativeを作ろう!
kwzr
1
3.2k
Apple Pencilと左利き対応
kwzr
5
2.7k
BitriseでUIの差分検出
kwzr
0
1.6k
CIをGASで継続的に改善したら幸せになった
kwzr
3
2k
Featured
See All Featured
SEOcharity - Dark patterns in SEO and UX: How to avoid them and build a more ethical web
sarafernandez
0
270
<Decoding/> the Language of Devs - We Love SEO 2024
nikkihalliwell
1
320
Building Better People: How to give real-time feedback that sticks.
wjessup
370
20k
Creating an realtime collaboration tool: Agile Flush - .NET Oxford
marcduiker
35
2.6k
The Invisible Side of Design
smashingmag
301
52k
The Mindset for Success: Future Career Progression
greggifford
PRO
0
490
Getting science done with accelerated Python computing platforms
jacobtomlinson
2
480
Neural Spatial Audio Processing for Sound Field Analysis and Control
skoyamalab
0
500
The Language of Interfaces
destraynor
162
27k
More Than Pixels: Becoming A User Experience Designer
marktimemedia
3
520
Future Trends and Review - Lecture 12 - Web Technologies (1019888BNR)
signer
PRO
0
3.7k
Max Prin - Stacking Signals: How International SEO Comes Together (And Falls Apart)
techseoconnect
PRO
0
460
Transcript
iOS・Androidで使える デザインシステムをどう実装するか pixiv Inc. ああうえ 2021.9.17 19:50〜 iOSDC Track C
2 自己紹介 • ああうえ / @_kwzr_ • 仕事: pixiv Sketchの開発
• 個人: Pose Arch 15万DL🎉 ああうえ モバイルアプリエンジニア
4 アジェンダ 1. デザインシステムとは 2. Kotlin Multiplatform Projectを使ったデザイントークンの実装 3. 画像・色アセットの作成
4. UIKit・SwiftUIでのコンポーネント作成
5 デザインシステムとは? 以下をまとめたもの • スタイルガイド • UIライブラリ • スタイルガイドとUIライブラリを繋ぐ、ルール・ツール群
6 スタイルガイド • デザインに関する原則がまとまったドキュメント • ボタンの見た目など、画面ごとに違ってユーザーを混乱させない • 統一したUIを提供することで、ブランディングを向上させる
7 UIライブラリ • UIの実装をまとめたもの • コード量・メンテナンスコストを減らし、生産性を上げる。誰が実装 しても同じものを作れるようにするのが目的 • 以下の要素で構成される ◦
デザイントークン ▪ Spacing, Typography, Border Radius, Color Palette, Icon, Animation… ◦ コンポーネント ▪ ボタン、スイッチ、...
8 ルール・ツール群 • どこにリソースを置くか?どう更新するか?などの運用ルール • 画像の書き出し、各OSで使えるように変換するスクリプトなど • ルールを自動化するためのCI
9 弊社の状況 6サービス、12のアプリ
10 弊社の状況 6サービス、12のアプリ Unity製 考慮 しない
11 状況 • 4サービス、8アプリがデザインシステムに対応する可能性 ◦ 歴史が長いアプリが多いのでまだまだ先は長い • 各アプリの実装状況 ◦ iOS
▪ Interface Builderで独自のCustom Classを設定 ▪ View Controllerで逐一スタイルを設定 ▪ SwiftUI ◦ Android ▪ 独自のViewを定義 ▪ styles.xmlに定義されたスタイルを適用
12 Webフロントでの導入 • 2019年ごろからデザインシステムの整備・導入が進められている • Tailwind CSSの思想で作られたユーティリティファーストなデザイン システム ◦ https://inside.pixiv.blog/2021/07/01/151500
13 Webフロントでの導入 • 以下のようなレイヤーで構成 • Constants(デザイントークン) ◦ Spacing, Typography, Border
Radius, Palette, Icons... • Utilities ◦ Tailwind CSSを拡張したCSS層 ◦ これによって、ReactでもVueでも使用可能 • Components ◦ Buttonなどのコンポーネント <Button> .bg-background1 .typography-12 const background1 = “#fff” const typography12 = { fontSize: 12, lineHeight: 20 } Components Utilities Constants
14 アプリにも導入する • Webフロントで導入が進められているデザインシステムを iOS・Androidにもどのように導入するか? • 異なるプラットフォーム間で、どうやってスタイルの一貫性を保って 運用していくか?
15 Single Source of Truth • 信頼できる唯一の情報源 ◦ どれが最新か、信頼性のあるデータなのか考えずに使えるよう にする
• 参照する情報が複数あると、どれを変更したり参照したりすればいい かわからない。参照元を一つにする • マルチプラットフォーム、複数サービスへの適用を考えて、一つの情 報源を参照できるように、運用ルール、CIなどを設定する
16 デザインシステムの構成 library-ios library-android • デザイントークン • コンポーネント • アセット
• 各プラットフォーム向けツール など image: Flaticon.com
17 デザインシステムの構成 library-ios library-android library-mobile-foundation • デザイントークン • モバイル共通の定義 •
コンポーネント • アセット • 各プラットフォーム向けツール image: Flaticon.com
18 デザイントークンとは • Single Source of Truthを実現するためにSalesforceが提唱 • デザインに関する以下のような定数を指す ◦
Spacing ◦ Border Radius ◦ Typography ◦ Color Palette ◦ … • 上記のような定数をYAML・JSONなどで定義しておき、 Web・iOS・Android各プラットフォームのコードに変換する
19 デザイントークンの実装 • Web・iOS・Androidで最初から共通化するのであれば、以下のようなデザイ ントークン実装を採用するのも良い • https://github.com/salesforce-ux/theo • https://github.com/amzn/style-dictionary •
https://github.com/diez/diez
20 MPPを使ったデザイントークン実装 • ピクシブで現在進めているデザイントークン実装 • Kotlin Multiplatform Project(MPP)をデザイントークン実装に使う • MPPとは?
◦ KotlinはMultiplatform Programmingを主要な利点として上げ ている ◦ Kotlinで書かれたコードをKotlin/JVM, Kotlin/Native, Kotlin/JSのネイティブコードに変換。マルチプラットフォーム での開発を可能にする ◦ 2021年9月1日現在はAlpha段階 ◦ Alpha段階: use at your own risk, expect migration issues
21 MPPの簡単な使用例 • プロジェクトを作ると、androidMain, commonMain, iosMainのよう に各プラットフォーム用のパッケージが生成される • 共通のコードはcommonMain /
commonTestに置かれる
22 各プラットフォームのコードを書く • expect, actual宣言で各プラットフォーム向けのコードを書ける
23 MPPを使うメリット • Kotlinによって、より高い表現力で実装できる ◦ 例えば、定義の再利用 • YAMLやJSONなどを各プラットフォームで読まなくて良い
24 ピクシブでの実装 • ピクシブでは既存の実装を生かすため、WebのTypeScript実装を JSON Schema化してKotlinの型に変換したものを配置している • なので、前述したメリットは実はほとんどない...が ◦ MPPを最初から選択できる場合は大きなメリットとなりそう
◦ アプリでのみ存在する定義を吸収する層にはなっている
25 ライブラリとして配布 library-ios library-android library-mobile-foundation • デザイントークン • モバイル共通の定義 •
コンポーネント • アセット • 各プラットフォーム向けツール image: Flaticon.com
26 ライブラリとして配布 library-ios library-android library-mobile-foundation • デザイントークン • モバイル共通の定義 •
コンポーネント • アセット • 各プラットフォーム向けツール image: Flaticon.com
27 Multiplatform Libraryを作る • MPPで作ったものは各OSのライブラリとして配布可能 • IntelliJ IDEAにはMultiplatform Libraryのテンプレートがあるので これを使うのがおすすめ
28 Swift Packageで配布する • multiplatform-swiftpackage Gradleプラグインを使用する • outputDirectoryをリポジトリのrootDirに設定しておくと、GitHub 経由などでSwift Packageを取得できる
build.gradle.kts 生成されるファイル
29 Mavenで配布 • maven-publish Gradleプラグインを使用してライブラリを配布する • iOSのartifactsも生成されるが、取得する際は必要なのものだけが取 得されるので、気にしなくて良いのがGood build.gradle
library-ios library-android library-mobile-foundation • デザイントークン • モバイル共通の定義 • コンポーネント •
アセット • 各プラットフォーム向けツール 30 アセット image: Flaticon.com
31 アセットの配布 • MPPではAssetを扱えない🥺 • iOSは画像や色をInterface Builder上から使えるようにしたり、ダー クモード対応のために、Asset Catalog対応したい ◦
library-iosの層でAsset Catalogを作る ◦ 既存のデザイントークンライブラリでも完全に対応されている ものがなさそう • Androidも同様に、library-androidの層でcolors.xmlや VectorDrawableを配置してあげる
32 アセットの変換 • iOS ◦ Asset Catalogへの変換を地道にやる ◦ iOS 12以下への対応
▪ SVG形式の利用はiOS 13+ ▪ PDF形式で吐き出す必要がある • Android ◦ SVG→VectorDrawableに変換する ◦ Android Studioのソースコードを参照
33 アイコンの自動更新 • Figmaのアイコンが更新されたらコード側にも反映されてほしい • Figma APIを叩いてCIでアイコンを自動更新する ◦ 特定のページにある特定の命名規則のアイコンを取り出し、PR を作成する
◦ 1日ごとなど定期実行する ◦ https://inside.pixiv.blog/2021/01/22/170000
library-ios library-android library-mobile-foundation • デザイントークン • モバイル共通の定義 • コンポーネント •
アセット • 各プラットフォーム向けツール 34 コンポーネント image: Flaticon.com
35 コンポーネントの実装 • library-ios, library-androidにそれぞれ実装 • 各OS、パラダイムごとに実装を用意 ◦ UIKit・SwiftUI・Android View・Jetpack
Compose ◦ 性質上仕方ない。将来的にはアプリ側の実装を揃えていく • FlutterのAdd-to-appは? ◦ 共通のコンポーネントを実装して、iOS・Androidから使用可 ◦ 各プラットフォームでの体験を大切にするため使わない ▪ MPPの思想でもUIは各OSのネイティブで実装することを勧 めている ▪ https://kotlinlang.org/docs/mobile/architect-kmm-ap p.html
36 コンポーネントの実装(UIKit) • デザインシステム自体の実装は、SwiftUIの方が楽... • デザインシステムを導入するためSwiftUIを必須化するのは非現実的 ◦ 引き続き、UIKitでも開発できるようにする • Interface
Builder上でスタイルが設定できるようにする
37 コンポーネントの実装(UIKit) • @IBInspectableにenumが使えない問題 ◦ ボタンのスタイルを設定するときにどうするか • 2つの方法 ◦ 1スタイル=1Custom
Classで実装する←こちらを採用 ▪ Figmaの定義と同じクラス名にする(prefixは除く) ◦ #if TARGET_INTERFACE_BUILDERを使って、コード上からは enum、Interface BuilderからはIntやStringで設定する方法 ▪ Int: 欠番などの扱い、Figma上のものと揃えるのが難しい ▪ String: 入力補完ができない ▪ IBLinterなどでLintが難しい • UIButton.Configuration(iOS 15+)は考えない ◦ iOS 14はまだしばらく切れないので...
38 コンポーネントの実装(SwiftUI) • スタイルを変えるのに、独自にViewを継承して実装はしない
39 コンポーネントの実装(SwiftUI) • Modifierを実装し、extensionでスタイルを利用できるように ◦ デザインシステムの定義ということがわかる ◦ 補完が効いて便利
40 コンポーネントの実装(SwiftUI) • TypographyやBorder Radiusなどもextension化 ◦ デザインシステムの定義ということがわかる ◦ 補完が効いて便利 ◦
.foregroundColor(PixivColor.background01) みたいな誤用防ぐ
42 コンポーネントの実装(Android) • Androidも、現状の実装と将来的にどうしたいかを考えて実装 • Android View ◦ viewInflaterClassを使った、既存のXMLの置き換え ◦
TextView→MaterialTextViewのように自動的に置き換えること ができる • Jetpack Compose ◦ まだ検討中 ◦ SwiftUIと似たような実装になりそう
43 まとめ • デザインシステムがあることによって、サービス・アプリのブラン ディングや開発体験に大きく影響 • Single Source of Truthを実現するために、デザイントークンの実装
が重要 ◦ style-dictionary、diezなど既存の実装を使うか、MPPを使うか プロダクトによって見極める • 色や画像リソースの変換は現状ではがんばるしかない • UIKit・SwiftUIでのコンポーネント設計方針を話した
45 参考文献 • Design Systems ―デジタルプロダクトのためのデザインシステム実 践ガイド Alla Kholmatova(著), 佐藤伸哉(翻訳)
• Kotlin Multiplatform | Kotlin