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
950
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
600
Featured
See All Featured
Designing Experiences People Love
moore
139
23k
GitHub's CSS Performance
jonrohan
1030
460k
Exploring the Power of Turbo Streams & Action Cable | RailsConf2023
kevinliebholz
28
4.5k
We Have a Design System, Now What?
morganepeng
51
7.3k
Mobile First: as difficult as doing things right
swwweet
222
9k
Scaling GitHub
holman
459
140k
How STYLIGHT went responsive
nonsquared
96
5.3k
Save Time (by Creating Custom Rails Generators)
garrettdimon
PRO
29
950
JavaScript: Past, Present, and Future - NDC Porto 2020
reverentgeek
47
5.1k
Code Reviewing Like a Champion
maltzj
521
39k
StorybookのUI Testing Handbookを読んだ
zakiyama
28
5.4k
個人開発の失敗を避けるイケてる考え方 / tips for indie hackers
panda_program
98
18k
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 予約カレンダーも触れるのでぜひ体験してください!