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
STORES Tech Conf 2024 “New Engineering” - 複数のS...
Search
satoryo56
October 10, 2024
0
870
STORES Tech Conf 2024 “New Engineering” - 複数のScrollViewが連動!STORES レジ でスプレッドシート風UIを実装しました
https://storesinc.tech/conf/2024
satoryo56
October 10, 2024
Tweet
Share
More Decks by satoryo56
See All by satoryo56
Gemini in Android Studio 使ってますか?
satoryo56
0
550
Featured
See All Featured
10 Git Anti Patterns You Should be Aware of
lemiorhan
PRO
656
59k
ReactJS: Keep Simple. Everything can be a component!
pedronauck
665
120k
Keith and Marios Guide to Fast Websites
keithpitt
410
22k
Sharpening the Axe: The Primacy of Toolmaking
bcantrill
38
1.9k
A Modern Web Designer's Workflow
chriscoyier
693
190k
It's Worth the Effort
3n
183
28k
Intergalactic Javascript Robots from Outer Space
tanoku
270
27k
Evolution of real-time – Irina Nazarova, EuRuKo, 2024
irinanazarova
5
440
[RailsConf 2023] Rails as a piece of cake
palkan
53
5k
Helping Users Find Their Own Way: Creating Modern Search Experiences
danielanewman
29
2.3k
What’s in a name? Adding method to the madness
productmarketing
PRO
22
3.2k
Fireside Chat
paigeccino
34
3.1k
Transcript
複数のScrollViewが連動! STORES レジ で スプレッドシート風UIを実装しました satoryo
自己紹介 2 satoryo X (Twitter) : satoryo056 STORES レジ・予約 iOS
/ Android エンジニア
3 普段 iOS アプリの開発を やっているひと?✋
4 iOS アプリ開発について 分かりやすく発表します!
STORES レジ について 5 • 2021年リリースの iPadOS 専用アプリ • 実店舗とネットショップが一緒になったPOSレジ
◦ 商品・在庫・売上管理が可能 • 小売業・サービス業の現地でのお会計に利用
STORES 予約 について • 予約や顧客情報の管理を行うプロダクト • サロンやフィットネスなどのオーナーさんが利用 • 例えば以下のことが可能 ◦
予約ページの作成 ◦ スケジュール管理 ◦ スタッフのシフト管理
STORES レジ x STORES 予約 7
STORES レジ について 8 • STORES 予約 の予約システムと STORES レジ
が連携 • アプリで予約内容の確認からお会計まで可能に
9 今回のメインテーマ 予約カレンダーをネイティブで実装したことについて紹介
iOS アプリの開発言語 10 • ネイティブアプリ ◦ Swift ◦ Objective-C •
クロスプラットフォームアプリ ◦ JavaScript (React Native) ◦ Dart (Flutter) ◦ Kotlin (Kotlin Multiplatform)
iOS アプリの開発言語 11 • ネイティブアプリ ◦ Swift ◦ Objective-C •
クロスプラットフォームアプリ ◦ JavaScript (React Native) ◦ Dart (Flutter) ◦ Kotlin (Kotlin Multiplatform) STORES レジは全て Swift で記述
iOS アプリの UI フレームワークと実装方法 12 • UIKit ◦ コード ◦
XIB (XML Interface Builder) ◦ Storyboard • SwiftUI ◦ コード
iOS アプリの UI フレームワークと実装方法 13 • UIKit ◦ コード ◦
XIB (XML Interface Builder) ◦ Storyboard • SwiftUI ◦ コード STORES レジでは一部を除いて 全て SwiftUI で UI 実装
STORES レジ アプリの採用言語・UIフレームワーク 14 • 言語 ◦ Swift • UI
フレームワーク ◦ SwiftUI (一部除く)
STORES レジ アプリの採用言語・UIフレームワーク 15 • 言語 ◦ Swift • UI
フレームワーク ◦ SwiftUI (一部除く) 予約カレンダーもSwiftUIで実装したい! まずは関連ライブラリを調査
カレンダー実装における関連ライブラリ 16 SpreadsheetView by bannzai 引用元:https://github.com/bannzai/SpreadsheetView
カレンダー実装における関連ライブラリ 17 SpreadsheetView by bannzai 引用元:https://github.com/bannzai/SpreadsheetView SwiftUI ではなく UIKit で実装
カレンダー実装における関連ライブラリ 18 CalendarLib by jumartin 引用元:https://github.com/jumartin/Calendar
カレンダー実装における関連ライブラリ 19 CalendarLib by jumartin 引用元:https://github.com/jumartin/Calendar そもそも Swift ではなく Objective-C
で書かれている
カレンダー実装における関連ライブラリ 20 SwiftUI で実装している ライブラリがなさそう ならば作るしかない!
予約カレンダーのデザイン 21
予約カレンダーの要素 22 • 3つの要素
予約カレンダーの要素 23 • 3つの要素 ◦ スタッフ
予約カレンダーの要素 24 • 3つの要素 ◦ スタッフ ◦ タイムライン
予約カレンダーの要素 25 • 3つの要素 ◦ スタッフ ◦ タイムライン ◦
予約情報
予約カレンダーの要素 26 • 3つの要素 ◦ スタッフ ◦ タイムライン ◦
予約情報 1日の予約情報を表示 縦・横方向の スクロールができる画面
予約カレンダーの要素 27 何かに似てませんか?
予約カレンダーの要素 28 スプレッドシート に似てませんか?
予約カレンダーの要素 29 似てますよね?
予約カレンダーの要素 30 そう、似てるんですよ
伏線回収したので改めて 31
予約カレンダーの実装:仕様 32 • 先頭列(縦)に「スタッフ」を表示 • 先頭行(横)に「タイムライン 0:00〜24:00」を表示 • 先頭行・先頭列はそれぞれ固定 •
スタッフとタイムラインの位置に合わせて予約情報を表示 • カレンダーはスタッフ人数に関係なく画面いっぱいに表示 ◦ 人数が少なくてもカレンダーの高さは不変 • 縦にも横にもスクロール可能
予約カレンダーの実装:試行錯誤 33 • ScrollView • GridView
予約カレンダーの実装:試行錯誤 34 予約情報の部分が画面中央に寄ってしまったり
予約カレンダーの実装:試行錯誤 35 予約情報の部分が画面中央に寄ってしまったり 余白がある
予約カレンダーの実装:試行錯誤 36 タイムラインの部分が画面の外に出てしまったり
予約カレンダーの実装:試行錯誤 37 タイムラインの部分が画面の外に出てしまったり 下へ引っ張ると
予約カレンダーの実装:試行錯誤 38 タイムラインの部分が画面の外に出てしまったり 下へ引っ張ると タイムラインの部分が出てくる
予約カレンダーの実装:試行錯誤 39 タイムラインと予約情報のセルがずれてしまったり
予約カレンダーの実装:試行錯誤 40 タイムラインと予約情報のセルがずれてしまったり ずれている ずれている
予約カレンダーの実装:試行錯誤 41 • 改善できないか試行錯誤 ◦ ScrollView の中に Spacer を追加 ◦
View の frame を定義 ◦ GeometryReader を使用 ◦ LazyVStack と GridLayout を駆使 ◦ etc …
予約カレンダーの実装:試行錯誤 42 • 改善できないか試行錯誤 ◦ ScrollView の中に Spacer を追加 ◦
View の frame を定義 ◦ GeometryReader を使用 ◦ LazyVStack と GridLayout を駆使 ◦ etc … 改善の兆しは見えず
予約カレンダーの実装:気づき 43
予約カレンダーの実装:気づき 44 • 3つの要素 ◦ スタッフ ◦ タイムライン ◦
予約情報
予約カレンダーの実装:気づき 45 1. 縦にスクロールする場合 ・スタッフをスクロールしたら 予約情報も一緒にスクロール ・予約情報をスクロールしたら スタッフも一緒にスクロール
予約カレンダーの実装:気づき 46 1. 縦にスクロールする場合 ・スタッフをスクロールしたら 予約情報も一緒にスクロール ・予約情報をスクロールしたら スタッフも一緒にスクロール
予約カレンダーの実装:気づき 47 1. 縦にスクロールする場合 ・スタッフをスクロールしたら 予約情報も一緒にスクロール ・予約情報をスクロールしたら スタッフも一緒にスクロール
予約カレンダーの実装:気づき 48 1. 縦にスクロールする場合 ・スタッフをスクロールしたら 予約情報も一緒にスクロール ・予約情報をスクロールしたら スタッフも一緒にスクロール
予約カレンダーの実装:気づき 49 1. 縦にスクロールする場合 ・スタッフをスクロールしたら 予約情報も一緒にスクロール ・予約情報をスクロールしたら スタッフも一緒にスクロール
予約カレンダーの実装:気づき 50 2. 横にスクロールする場合 ・タイムラインをスクロールしたら 予約情報も一緒にスクロール ・予約情報をスクロールしたら タイムラインも一緒にスクロール
予約カレンダーの実装:気づき 51 2. 横にスクロールする場合 ・タイムラインをスクロールしたら 予約情報も一緒にスクロール ・予約情報をスクロールしたら タイムラインも一緒にスクロール
予約カレンダーの実装:気づき 52 2. 横にスクロールする場合 ・タイムラインをスクロールしたら 予約情報も一緒にスクロール ・予約情報をスクロールしたら タイムラインも一緒にスクロール
予約カレンダーの実装:気づき 53 2. 横にスクロールする場合 ・タイムラインをスクロールしたら 予約情報も一緒にスクロール ・予約情報をスクロールしたら タイムラインも一緒にスクロール
予約カレンダーの実装:気づき 54 2. 横にスクロールする場合 ・タイムラインをスクロールしたら 予約情報も一緒にスクロール ・予約情報をスクロールしたら タイムラインも一緒にスクロール
予約カレンダーの実装:気づき 55 縦にスクロール ・スタッフ & 予約情報 横にスクロール ・タイムライン & 予約情報
片方がスクロールしたら もう片方も連動させたい!
予約カレンダーの実装:気づき 56 縦にスクロール ・スタッフ & 予約情報 横にスクロール ・タイムライン & 予約情報
片方がスクロールしたら もう片方も連動させたい!
予約カレンダーの実装:気づき 57 縦にスクロール ・スタッフ & 予約情報 横にスクロール ・タイムライン & 予約情報
片方がスクロールしたら もう片方も連動させたい!
予約カレンダーの実装:関連実装を発見 58 複数のScrollViewを同時に動かす実装を発見 引用元:https://github.com/stonko1994/SimultaneouslyScrollView
予約カレンダーの実装:SimultaneouslyScrollView の紹介 59 引用元:https://github.com/stonko1994/SimultaneouslyScrollView
予約カレンダーの実装:SimultaneouslyScrollView の紹介 60 引用元:https://github.com/stonko1994/SimultaneouslyScrollView
予約カレンダーの実装:SimultaneouslyScrollView の紹介 61 引用元:https://github.com/stonko1994/SimultaneouslyScrollView
予約カレンダーの実装:SimultaneouslyScrollView の紹介 62 引用元:https://github.com/stonko1994/SimultaneouslyScrollView 真ん中のScrollViewをスクロールすると 左右のScrollViewも連動してスクロールする
予約カレンダーの実装:SimultaneouslyScrollView の紹介 63 引用元:https://github.com/stonko1994/SimultaneouslyScrollView 真ん中のScrollViewをスクロールすると 左右のScrollViewも連動してスクロールする なんとなくいけそうな予感!
予約カレンダーの実装:SimultaneouslyScrollView のソースコード 64 引用元:https://github.com/stonko1994/SimultaneouslyScrollView
予約カレンダーの実装:SimultaneouslyScrollView の処理フロー 65 引用元:https://github.com/stonko1994/SimultaneouslyScrollView 2. ScrollViewの配列を用意 3. 同じ方向にスクロール させる全てのScrollView を
配列に格納 1. スクロールする方向 (縦 or 横) を決定 4. ScrollView のスクロールを 検知する仕組みを用意 6. 配列内の全てのScrollView を 同じ位置まで自動スクロール 5. 任意の ScrollView を スクロール開始
予約カレンダーの実装:SimultaneouslyScrollView の処理フロー 66 引用元:https://github.com/stonko1994/SimultaneouslyScrollView 2. ScrollViewの配列を用意 3. 同じ方向にスクロール させる全てのScrollView を
配列に格納 1. スクロールする方向 (縦 or 横) を決定 4. ScrollView のスクロールを 検知する仕組みを用意 6. 配列内の全てのScrollView を 同じ位置まで自動スクロール 5. 任意の ScrollView を スクロール開始
予約カレンダーの実装:SimultaneouslyScrollView の処理フロー 67 引用元:https://github.com/stonko1994/SimultaneouslyScrollView 2. ScrollViewの配列を用意 3. 同じ方向にスクロール させる全てのScrollView
を 配列に格納 1. スクロールする方向 (縦 or 横) を決定 4. ScrollView のスクロールを 検知する仕組みを用意 6. 配列内の全てのScrollView を 同じ位置まで自動スクロール 5. 任意の ScrollView を スクロール開始
予約カレンダーの実装:SimultaneouslyScrollView の処理フロー 68 引用元:https://github.com/stonko1994/SimultaneouslyScrollView 2. ScrollViewの配列を用意 3. 同じ方向にスクロール させる全ての
ScrollView を 配列に格納 1. スクロールする方向 (縦 or 横) を決定 4. ScrollView のスクロールを 検知する仕組みを用意 6. 配列内の全てのScrollView を 同じ位置まで自動スクロール 5. 任意の ScrollView を スクロール開始
予約カレンダーの実装:SimultaneouslyScrollView の処理フロー 69 引用元:https://github.com/stonko1994/SimultaneouslyScrollView 2. ScrollViewの配列を用意 3. 同じ方向にスクロール させる全てのScrollView を
配列に格納 1. スクロールする方向 (縦 or 横) を決定 4. ScrollView のスクロールを 検知する仕組みを用意 6. 配列内の全てのScrollView を 同じ位置まで自動スクロール 5. 任意の ScrollView を スクロール開始
予約カレンダーの実装:SimultaneouslyScrollView の処理フロー 70 引用元:https://github.com/stonko1994/SimultaneouslyScrollView 2. ScrollViewの配列を用意 3. 同じ方向にスクロール させる全てのScrollView を
配列に格納 1. スクロールする方向 (縦 or 横) を決定 4. ScrollView のスクロールを 検知する仕組みを用意 6. 配列内の全てのScrollView を 同じ位置まで自動スクロール 5. 任意の ScrollView を スクロール開始
予約カレンダーの実装:SimultaneouslyScrollView の処理フロー 71 引用元:https://github.com/stonko1994/SimultaneouslyScrollView 2. ScrollViewの配列を用意 3. 同じ方向にスクロール させる全てのScrollView を
配列に格納 1. スクロールする方向 (縦 or 横) を決定 4. ScrollView のスクロールを 検知する仕組みを用意 6. 配列内の全ての ScrollView を同じ位置まで自動スクロール 5. 任意の ScrollView を スクロール開始
予約カレンダーの実装:ScrollView のスクロールを検知する仕組み 72 UIScrollViewDelegate を継承した extension を用意 引用元:https://github.com/stonko1994/SimultaneouslyScrollView
予約カレンダーの実装:ScrollView のスクロールを検知する仕組み 73 UIScrollViewDelegate を継承した extension を用意 引用元:https://github.com/stonko1994/SimultaneouslyScrollView スクロール開始時 に呼ばれる
予約カレンダーの実装:ScrollView のスクロールを検知する仕組み 74 7. UIScrollViewDelegate を継承した extension を定義 引用元:https://github.com/stonko1994/SimultaneouslyScrollView スクロール中に
呼ばれる
予約カレンダーの実装:ScrollView のスクロールを検知する仕組み 75 UIScrollViewDelegate を継承した extension を定義 引用元:https://github.com/stonko1994/SimultaneouslyScrollView 操作中の ScrollView
を代入 操作中でない配列内の 全ての ScrollView を スクロールさせる
予約カレンダーの実装:SimultaneouslyScrollView を反映 76 • 3つの要素 ◦ スタッフ ◦ タイムライン
◦ 予約情報
予約カレンダーの実装:SimultaneouslyScrollView を反映 77
予約カレンダーの実装:SimultaneouslyScrollView を反映 78
予約カレンダーの実装:SimultaneouslyScrollView を反映 79 ス タ ッ フ タイムライン 予約情報 横に並べる
予約カレンダーの実装:SimultaneouslyScrollView を反映 80 ス タ ッ フ タイムライン 予約情報 縦に並べる
予約カレンダーの実装:SimultaneouslyScrollView を反映 81
予約カレンダーの実装:SimultaneouslyScrollView を反映 82
予約カレンダーの実装:SimultaneouslyScrollView を反映 83
予約カレンダーの実装:SimultaneouslyScrollView を反映 84
予約カレンダーの実装:SimultaneouslyScrollView を反映 85
予約カレンダーの実装:SimultaneouslyScrollView の処理フロー 86 引用元:https://github.com/stonko1994/SimultaneouslyScrollView 2. ScrollViewの配列を用意 3. 同じ方向にスクロール させる全てのScrollView を
配列に格納 1. スクロールする方向 (縦 or 横) を決定 4. ScrollView のスクロールを 検知する仕組みを用意 6. 配列内の全ての ScrollView を同じ位置まで自動スクロール 5. 任意の ScrollView を スクロール開始
完成! 87
余談:予約の表示 88 予約情報の考慮事項
余談:予約の表示 89 予約情報の考慮事項 • 開始時間 ◦ 00分・30分・45分開始... • 予約の長さ ◦
1時間・30分・2.5時間... • 予約の重複 ◦ スタッフと予約は 1 対 多
余談:予約の表示 90 予約情報の考慮事項 • 開始時間 ◦ タイムラインの位置を考慮 • 予約の長さ
◦ 予約ごとに描画の幅が可変 • 予約の重複 ◦ スタッフの高さも可変
余談:予約の表示 91 予約情報の考慮事項 APIで取得した予約情報を スタッフごとに抽出し 予約同士で時間の重複を判定し スタッフの高さを変えつつ 予約のセルの幅を変えながら 1つずつ描画する
余談:予約の表示 92 2つの ForEach を使用し予約を1つずつ描画
余談:予約の表示 93 2つの ForEach を使用し予約を1つずつ描画
改めて、完成! 94
改めて、完成! 95
予約カレンダーの課題・改善点 96 • パフォーマンス面 ◦ 予約数が増えるほど描画する予約情報も増加 ◦ 大量の予約を描画するとスクロールがカクつく
• UI 操作 ◦ ドラッグ&ドロップで時間を変更したいという要望 ▪ 予約ごとに座標を指定しているのが課題
まとめ 97 • STORES レジ アプリの予約カレンダーを紹介 • 複数のScrollViewを同時に動かすロジックにより スプレッドシート風なUIを実装 •
まだまだ課題はあるが今後改善する予定
さいごに:STORES 各サービスの連携デモ 98 予約カレンダーも触れるのでぜひ体験してください!