0Pricing
Swift Academy · レッスン

ヒーロートランジションのためのmatchedGeometryEffect

namespaceとmatched IDを使い、View間でシームレスなヒーローアニメーションを作成します。

「ヒーロートランジションのためのmatchedGeometryEffect」はCoddyKit上の無料Swift Academyレッスンです。 これはレッスン2/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはSwift Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Swift Academyコースには全4レッスンが含まれています。

matchedGeometryEffectとは何ですか?

matchedGeometryEffectは、2つの状態間でビューの位置とサイズをアニメーションさせ、「ヒーロー」トランジションを作成します。

struct HeroDemo: View {
  @Namespace private var ns
  @State private var expanded = false
  var body: some View {
    if expanded {
      BigCard().matchedGeometryEffect(id: "card", in: ns)
    } else {
      SmallCard().matchedGeometryEffect(id: "card", in: ns)
    }
  }
}

Namespaceの作成

親ビューで@Namespaceを宣言します。すべての対象ビューでこのnamespaceを共有します。

struct ParentView: View {
  @Namespace private var heroNamespace
}

モディファイアの適用

ソースビューと遷移先ビューの両方に、同じidを指定した.matchedGeometryEffect(id:in:)を適用します。

Image("cover")
  .matchedGeometryEffect(id: "albumArt", in: heroNamespace)

トランジションの開始

状態の変更をwithAnimationで囲むと、2つのビュー間のジオメトリをアニメーションさせられます。

Button("Expand") {
  withAnimation(.spring()) {
    isExpanded.toggle()
  }
}

リストから詳細画面へのヒーロー遷移

典型的なヒーローパターンです。リスト項目をタップすると、matchedGeometryEffectを使って全画面の詳細画面へ展開します。

ForEach(items) { item in
  ThumbnailRow(item: item)
    .matchedGeometryEffect(id: item.id, in: ns)
    .onTapGesture { withAnimation { selected = item } }
}
if let sel = selected {
  DetailView(item: sel)
    .matchedGeometryEffect(id: sel.id, in: ns)
}

isSourceパラメータ

2つのビューで同じidを共有する場合、起点にはisSource: true(デフォルト)を指定し、遷移先にはisSource: falseを指定します。

SmallImage()
  .matchedGeometryEffect(id: "img", in: ns, isSource: true)
LargeImage()
  .matchedGeometryEffect(id: "img", in: ns, isSource: false)

アンカーとサイズのプロパティ

一致させるアンカーポイントとジオメトリのプロパティ(位置やサイズ)をカスタマイズします。

.matchedGeometryEffect(
  id: "box",
  in: ns,
  anchor: .center,
  properties: [.position, .size]
)

AnyTransitionとの組み合わせ

ヒーローアニメーションを.transitionと組み合わせると、コンテンツのフェードインやスライドインの方法も制御できます。

DetailView()
  .matchedGeometryEffect(id: "card", in: ns)
  .transition(.opacity)

リスト内の複数のヒーロー

項目の識別子から一意のIDを生成して使用すると、複数の独立したヒーローアニメーションを実行できます。

ForEach(products) { p in
  ProductCard(p)
    .matchedGeometryEffect(id: p.id, in: ns)
}

よくある落とし穴

同じIDを持つ2つのビューを同時に表示してはいけません。常にどちらか一方だけを表示しないと、レイアウトの不具合が発生します。

// Wrong: both views visible at same time
Small().matchedGeometryEffect(id: "x", in: ns)
Large().matchedGeometryEffect(id: "x", in: ns)
// Correct: use if/else or ZStack with opacity toggling

パフォーマンスのヒント

matched viewは軽量に保ってください。matched view内に複雑な階層を含めると、アニメーション中にフレーム落ちが発生することがあります。

// Prefer simple shapes inside matched containers
// Move heavy content outside the matched frame

理解度チェック

ヒーロートランジションで2つのビューをソースと遷移先として関連付けるには、何が必要ですか?

レッスンのまとめ

@Namespaceと.matchedGeometryEffect(id:in:)を使ってヒーロートランジションを作成します。状態の変更をwithAnimationで囲みます。レイアウトの競合を避けるため、一度に表示するmatched viewは1つだけにしてください。

よくある質問

「ヒーロートランジションのためのmatchedGeometryEffect」レッスンは無料ですか?

はい。「ヒーロートランジションのためのmatchedGeometryEffect」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Swift Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Swift Academyコースには全4レッスンが含まれています。

「ヒーロートランジションのためのmatchedGeometryEffect」で何を学びますか?

namespaceとmatched IDを使い、View間でシームレスなヒーローアニメーションを作成します。 ブラウザで直接実行するハンズオンコードでSwift Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

Swift Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのSwift Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン2/4です。

「ヒーロートランジションのためのmatchedGeometryEffect」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このSwift Academyレッスンでコードを書いて実行できますか?

はい。すべてのSwift Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. 暗黙的アニメーションと明示的アニメーション
  2. ヒーロートランジションのためのmatchedGeometryEffect
  3. カスタムAnimatableModifierとAnimatable
  4. 高パフォーマンス描画のためのTimelineViewとCanvas
← Swift Academyに戻る