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

iOS 曜日ランキングが出来上がるまで

tokizo
September 19, 2024
1.8k

iOS 曜日ランキングが出来上がるまで

tokizo

September 19, 2024
Tweet

Transcript

  1. 横方向に無限スクロールして曜日を変更 19 • 横方向のスクロール ◦ SwiftUI ✅ ◦ ScrollView(.horizontal) ◦

    ページングを素朴に実装すると親要素の縦スクロールと競合 ▪ 素朴: .gesture(_:including:) ▪ → .simultaneousGesture(_:including:) と DragGesture(minimumDistance:) を使い、 縦横スクロールの競合をハンドリング
  2. 横方向に無限スクロールして曜日を変更 21 • 無限スクロール ◦ SwiftUI ✅ ◦ .onChange(of:perform:) で選択中の曜日を

    監視し、特定の曜日間の移動を特別扱い ▪ 最初の曜日から左の曜日へ: 最後の曜日に移動 ▪ 最後の曜日から右の曜日へ: 最初の曜日に移動
  3. SwiftUI 版の課題 26 • 表示が崩れる • 加えて、操作感が良くない ◦ 横スクロールの手触りが悪く、反応が悪い ▪

    なめらかさを感じない ◦ 横スクロールをしたつもりが親要素の縦スクロールが 優先される時があった ▪ 公開されている値で調整しても満足感は得られなかった
  4. 要件は満たせたか? (1/2) 34 • 曜日ごとの作品数に応じて高さを変更 ◦ → SwiftUI で作った時と同じ処理 ▪

    各曜日は SwiftUI.View から変更無し ▪ > GeometryReader で曜日ごとの高さを取得し、 曜日変更毎に全体の高さとして適用 ◦ 細かな不具合の対応も複数行った ▪ スクロール中に高さを変更するとパフォーマンスが落ちる等
  5. 最終的な構成 • ホーム画面 SwiftUI.ScrollView ◦ 曜日ランキング SwiftUI.View ▪ ヘッダー SwiftUI.View

    ▪ 全曜日 UIViewControllerRepresentable • UIPageViewController ◦ 各曜日 UIHostingController ▪ SwiftUI.View 36
  6. まとめ • 曜日ランキングとは ◦ → 曜日ごとにランキング形式で連載作品を表示 • 最初の実装方針と出くわした課題 ◦ →

    SwiftUI だけで作るとパフォーマンスが悪かった • 課題に対するアプローチ ◦ → UIPageViewController を使うことで課題を解消できた 37