Upgrade to Pro — share decks privately, control downloads, hide ads and more …

STORES Tech Conf 2024 “New Engineering” - 複数のS...

satoryo56
October 10, 2024
870

STORES Tech Conf 2024 “New Engineering” - 複数のScrollViewが連動!STORES レジ でスプレッドシート風UIを実装しました

satoryo56

October 10, 2024
Tweet

Transcript

  1. STORES レジ について 5 • 2021年リリースの iPadOS 専用アプリ • 実店舗とネットショップが一緒になったPOSレジ

    ◦ 商品・在庫・売上管理が可能 
 • 小売業・サービス業の現地でのお会計に利用
  2. STORES レジ について 8 • STORES 予約 の予約システムと STORES レジ

    が連携 • アプリで予約内容の確認からお会計まで可能に
  3. iOS アプリの開発言語 10 • ネイティブアプリ ◦ Swift
 ◦ Objective-C
 •

    クロスプラットフォームアプリ ◦ JavaScript (React Native)
 ◦ Dart (Flutter)
 ◦ Kotlin (Kotlin Multiplatform)

  4. iOS アプリの開発言語 11 • ネイティブアプリ ◦ Swift
 ◦ Objective-C
 •

    クロスプラットフォームアプリ ◦ JavaScript (React Native)
 ◦ Dart (Flutter)
 ◦ Kotlin (Kotlin Multiplatform)
 STORES レジは全て Swift で記述
  5. iOS アプリの UI フレームワークと実装方法 12 • UIKit ◦ コード
 ◦

    XIB (XML Interface Builder)
 ◦ Storyboard
 • SwiftUI ◦ コード

  6. iOS アプリの UI フレームワークと実装方法 13 • UIKit ◦ コード
 ◦

    XIB (XML Interface Builder)
 ◦ Storyboard
 • SwiftUI ◦ コード
 STORES レジでは一部を除いて 全て SwiftUI で UI 実装
  7. STORES レジ アプリの採用言語・UIフレームワーク 15 • 言語 ◦ Swift
 • UI

    フレームワーク ◦ SwiftUI (一部除く) 
 予約カレンダーもSwiftUIで実装したい! まずは関連ライブラリを調査
  8. 予約カレンダーの要素 26 • 3つの要素 ◦ スタッフ
 ◦ タイムライン 
 ◦

    予約情報
 1日の予約情報を表示 縦・横方向の スクロールができる画面
  9. 予約カレンダーの実装:仕様 32 • 先頭列(縦)に「スタッフ」を表示 • 先頭行(横)に「タイムライン 0:00〜24:00」を表示 • 先頭行・先頭列はそれぞれ固定 •

    スタッフとタイムラインの位置に合わせて予約情報を表示 • カレンダーはスタッフ人数に関係なく画面いっぱいに表示 ◦ 人数が少なくてもカレンダーの高さは不変 
 • 縦にも横にもスクロール可能
  10. 予約カレンダーの実装:試行錯誤 41 • 改善できないか試行錯誤 ◦ ScrollView の中に Spacer を追加
 ◦

    View の frame を定義
 ◦ GeometryReader を使用
 ◦ LazyVStack と GridLayout を駆使
 ◦ etc …

  11. 予約カレンダーの実装:試行錯誤 42 • 改善できないか試行錯誤 ◦ ScrollView の中に Spacer を追加
 ◦

    View の frame を定義
 ◦ GeometryReader を使用
 ◦ LazyVStack と GridLayout を駆使
 ◦ etc …
 改善の兆しは見えず
  12. 予約カレンダーの実装:SimultaneouslyScrollView の処理フロー 65 引用元:https://github.com/stonko1994/SimultaneouslyScrollView
 2. ScrollViewの配列を用意
 3. 同じ方向にスクロール
 させる全てのScrollView を


    配列に格納
 1. スクロールする方向
 (縦 or 横) を決定
 4. ScrollView のスクロールを 検知する仕組みを用意
 6. 配列内の全てのScrollView を 同じ位置まで自動スクロール
 5. 任意の ScrollView を
 スクロール開始

  13. 予約カレンダーの実装:SimultaneouslyScrollView の処理フロー 66 引用元:https://github.com/stonko1994/SimultaneouslyScrollView
 2. ScrollViewの配列を用意
 3. 同じ方向にスクロール
 させる全てのScrollView を


    配列に格納
 1. スクロールする方向 
 (縦 or 横) を決定
 4. ScrollView のスクロールを 検知する仕組みを用意
 6. 配列内の全てのScrollView を 同じ位置まで自動スクロール
 5. 任意の ScrollView を
 スクロール開始

  14. 予約カレンダーの実装:SimultaneouslyScrollView の処理フロー 67 引用元:https://github.com/stonko1994/SimultaneouslyScrollView
 2. ScrollViewの配列を用意 
 3. 同じ方向にスクロール
 させる全てのScrollView

    を
 配列に格納
 1. スクロールする方向
 (縦 or 横) を決定
 4. ScrollView のスクロールを 検知する仕組みを用意
 6. 配列内の全てのScrollView を 同じ位置まで自動スクロール
 5. 任意の ScrollView を
 スクロール開始

  15. 予約カレンダーの実装:SimultaneouslyScrollView の処理フロー 68 引用元:https://github.com/stonko1994/SimultaneouslyScrollView
 2. ScrollViewの配列を用意
 3. 同じ方向にスクロール 
 させる全ての

    ScrollView を
 配列に格納 
 1. スクロールする方向
 (縦 or 横) を決定
 4. ScrollView のスクロールを 検知する仕組みを用意
 6. 配列内の全てのScrollView を 同じ位置まで自動スクロール
 5. 任意の ScrollView を
 スクロール開始

  16. 予約カレンダーの実装:SimultaneouslyScrollView の処理フロー 69 引用元:https://github.com/stonko1994/SimultaneouslyScrollView
 2. ScrollViewの配列を用意
 3. 同じ方向にスクロール
 させる全てのScrollView を


    配列に格納
 1. スクロールする方向
 (縦 or 横) を決定
 4. ScrollView のスクロールを 検知する仕組みを用意 
 6. 配列内の全てのScrollView を 同じ位置まで自動スクロール
 5. 任意の ScrollView を
 スクロール開始

  17. 予約カレンダーの実装:SimultaneouslyScrollView の処理フロー 70 引用元:https://github.com/stonko1994/SimultaneouslyScrollView
 2. ScrollViewの配列を用意
 3. 同じ方向にスクロール
 させる全てのScrollView を


    配列に格納
 1. スクロールする方向
 (縦 or 横) を決定
 4. ScrollView のスクロールを 検知する仕組みを用意
 6. 配列内の全てのScrollView を 同じ位置まで自動スクロール
 5. 任意の ScrollView を
 スクロール開始 

  18. 予約カレンダーの実装:SimultaneouslyScrollView の処理フロー 71 引用元:https://github.com/stonko1994/SimultaneouslyScrollView
 2. ScrollViewの配列を用意
 3. 同じ方向にスクロール
 させる全てのScrollView を


    配列に格納
 1. スクロールする方向
 (縦 or 横) を決定
 4. ScrollView のスクロールを 検知する仕組みを用意
 6. 配列内の全ての ScrollView を同じ位置まで自動スクロール 
 5. 任意の ScrollView を
 スクロール開始

  19. 予約カレンダーの実装:SimultaneouslyScrollView の処理フロー 86 引用元:https://github.com/stonko1994/SimultaneouslyScrollView
 2. ScrollViewの配列を用意
 3. 同じ方向にスクロール
 させる全てのScrollView を


    配列に格納
 1. スクロールする方向
 (縦 or 横) を決定
 4. ScrollView のスクロールを 検知する仕組みを用意
 6. 配列内の全ての ScrollView を同じ位置まで自動スクロール 
 5. 任意の ScrollView を
 スクロール開始

  20. 余談:予約の表示 89 予約情報の考慮事項 • 開始時間 ◦ 00分・30分・45分開始...
 • 予約の長さ ◦

    1時間・30分・2.5時間...
 • 予約の重複 ◦ スタッフと予約は 1 対 多

  21. 余談:予約の表示 90 予約情報の考慮事項 • 開始時間 ◦ タイムラインの位置を考慮 
 • 予約の長さ

    ◦ 予約ごとに描画の幅が可変 
 • 予約の重複 ◦ スタッフの高さも可変 

  22. 予約カレンダーの課題・改善点 96 • パフォーマンス面 ◦ 予約数が増えるほど描画する予約情報も増加 
 ◦ 大量の予約を描画するとスクロールがカクつく 


    • UI 操作 ◦ ドラッグ&ドロップで時間を変更したいという要望 
 ▪ 予約ごとに座標を指定しているのが課題