Swift

SwiftUI カスタムトランジション入門と実務活用ガイド

ⓘ本ページはプロモーションが含まれています

スポンサードリンク

1️⃣ 標準トランジションの限界

SwiftUI が標準で提供する opacityslidemove などは 「表示 ⇄ 非表示」 を前提にしたシンプルなアニメーションです。

トランジション 主な挙動 複合・非線形遷移への対応可否
opacity 0 → 1 のフェードイン/アウト ❌(スケールや回転は不可)
slide / move 画面端からの平行移動 ❌(サイズ変化を伴うレイアウトシフトは不可)
scale 拡大縮小のみ ❌(同時に位置・回転を変えられない)

典型的な失敗例

  • カード一覧 → 詳細画面
    カードが拡大しつつ位置も変わる場合、slide だけではサイズが固定されたままになる。
  • 非線形イージングの適用
    spring(response:dampingFraction:) のようなカスタムイーズは標準トランジションでは指定できない。

結論:複数プロパティを同時に変化させる、または物理ベースのイージングを使う場合は カスタムトランジションが必須 です。


2️⃣ AnyTransition.modifierAnimatableModifier で作る基本的なカスタム遷移

2‑1. コアコンセプト

  • AnyTransition.modifier(active:identity:)任意の ViewModifier を「開始状態」と「終了状態」に分けて定義できる。
  • AnimatableModifier が提供する animatableData に数値型を置くと、SwiftUI が自動で補間してくれる。

2‑2. 実装例(Scale + Fade)

使用例

ポイントScaleFadeModifier のみでスケールとフェードの同時変化が実現でき、コード量が極めてコンパクトになる。


3️⃣ 複合トランジション ― .combined(with:) の活用

3‑1. 基本構文

transitionAtransitionB が内部で保持する modifier同時に適用 した新しい AnyTransition が生成されます。

3‑2. 実装例(回転 + スケール)

使用例

ポイント:個別に定義した遷移を組み合わせるだけで、回転 + スケール といった高度なエフェクトが 10 行程度で完成します。


4️⃣ iOS 17 / Xcode 15 の新機能とリッチ遷移パターン

4‑1. .animation(_:value:)(Xcode 15)

  • 状態 → アニメーション の紐付けが明示的になるため、他のアニメーションと衝突しにくい。
  • value が変化した瞬間だけアニメーションが走るので、不要な再描画を防げます。

4‑2. matchedGeometryEffect とカスタム Modifier の組み合わせ

  • 画像とテキストが同一 ID で共有され、別画面へ遷移した瞬間に位置・サイズが自然に補間される。
  • ScaleFadeModifier が同時にフェードイン/アウトを付与し、App Store のカード展開に近い演出が完成。

参考記事: 「SwiftUI で作るカスタムトランジション」(Zenn) – https://zenn.dev/yourname/articles/custom-transition-swiftui

4‑3. 完全サンプル(カード一覧 → 詳細)


5️⃣ 実務でのデバッグ・パフォーマンス最適化

項目 推奨手法
プレビューで遷移確認 @State static var previewToggle = falseDispatchQueue.main.asyncAfter を組み合わせ、1 秒後に自動トリガー。
無限再描画の防止 - AnimatableModifieranimatableData に不要なプロパティを入れない
- 大規模ビューは EquatableView でラップし差分判定を高速化
状態管理の粒度 @StateObject → ビジネスロジック、@ObservedObject → UI だけに絞る。変更頻度が高いプロパティは別の @State に切り出す。
メモリリーク対策 クロージャ内で self[weak self] 捕捉し、特に TimerDispatchQueue 系統の非同期処理で注意する。

Xcode Preview の自動トリガー例


6️⃣ まとめ

  • 標準トランジションはシンプル(フェード・スライド)に限定され、複合や非線形アニメーションには不向き。
  • AnyTransition.modifier + AnimatableModifier がカスタム遷移の基礎であり、任意プロパティを滑らかに補間できる。
  • .combined(with:) によってトランジション同士を合成すれば、回転 + スケールやフェード + シフトといった多彩な演出が数行で実装可能。
  • iOS 17 / Xcode 15 の .animation(_:value:)matchedGeometryEffect を併用すれば、App Store 風カード展開やモーダルシートのリッチ遷移を簡単に作れる。
  • 実務ではプレビューでの自動トリガー確認と、無限再描画防止策・状態管理の粒度調整が必須

これらのテクニックを組み合わせることで、「すぐに使える」オリジナル遷移を iOS 17・Swift 5.9 環境で構築でき、ユーザー体験を格段に向上させることができます。

スポンサードリンク

-Swift