0Pricing
Swift Academy · Lekcja

matchedGeometryEffect dla przejść typu Hero

Tworzenie płynnych animacji Hero między widokami za pomocą przestrzeni nazw i dopasowanych identyfikatorów.

matchedGeometryEffect dla przejść typu Hero to bezpłatna lekcja Swift Academy na CoddyKit. To lekcja 2 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej Swift Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs Swift Academy zawiera 4 lekcji w sumie.

Czym jest matchedGeometryEffect

matchedGeometryEffect animuje położenie i rozmiar widoku między dwoma stanami, tworząc przejście typu „hero”.

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)
    }
  }
}

Tworzenie przestrzeni nazw

Zadeklaruj @Namespace w widoku nadrzędnym. Wszystkie dopasowywane widoki współdzielą tę przestrzeń nazw.

struct ParentView: View {
  @Namespace private var heroNamespace
}

Zastosowanie modyfikatora

Zastosuj .matchedGeometryEffect(id:in:) z takim samym id do widoku źródłowego i docelowego.

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

Uruchamianie przejścia

Umieść zmianę stanu w withAnimation, aby animować geometrię między dwoma widokami.

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

Przejście hero z listy do szczegółów

Klasyczny wzorzec hero: stuknięcie elementu listy powoduje jego rozwinięcie do pełnoekranowego widoku szczegółów z użyciem 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)
}

Parametr isSource

Gdy dwa widoki współdzielą identyfikator, oznacz widok źródłowy za pomocą isSource: true (wartość domyślna), a docelowy za pomocą isSource: false.

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

Właściwości punktu zakotwiczenia i rozmiaru

Dostosuj punkt zakotwiczenia oraz właściwości geometrii (położenie/rozmiar), które mają być dopasowywane.

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

Łączenie z AnyTransition

Połącz animację hero z .transition, aby dodatkowo kontrolować sposób pojawiania się i przesuwania zawartości.

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

Wiele przejść hero na liście

Użyj unikatowych identyfikatorów wyprowadzonych z identyfikatorów elementów, aby uruchamiać wiele niezależnych animacji hero.

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

Typowe pułapki

Oba widoki z tym samym identyfikatorem nie mogą być widoczne jednocześnie — w danym momencie powinien być widoczny tylko jeden, w przeciwnym razie wystąpią błędy układu.

// 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

Wskazówka dotycząca wydajności

Widoki z dopasowywaną geometrią powinny być lekkie. Złożone hierarchie wewnątrz takich widoków mogą powodować gubienie klatek podczas animacji.

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

Szybkie sprawdzenie

Co jest wymagane, aby połączyć dwa widoki jako źródło i cel w przejściu typu hero?

Podsumowanie lekcji

Twórz przejścia hero za pomocą @Namespace i .matchedGeometryEffect(id:in:). Umieszczaj zmiany stanu w withAnimation. Upewnij się, że w danym momencie widoczny jest tylko jeden dopasowywany widok, aby uniknąć konfliktów układu.

Często zadawane pytania

Czy lekcja „matchedGeometryEffect dla przejść typu Hero” jest bezpłatna?

Tak — pełny tekst „matchedGeometryEffect dla przejść typu Hero” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu Swift Academy, przejdź na CoddyKit PRO. Kurs Swift Academy zawiera 4 lekcji w sumie.

Co nauczysz się w „matchedGeometryEffect dla przejść typu Hero”?

Tworzenie płynnych animacji Hero między widokami za pomocą przestrzeni nazw i dopasowanych identyfikatorów. Ćwiczysz Swift Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.

Czy potrzebuję doświadczenia, aby zacząć Swift Academy?

Nie wymagamy żadnego doświadczenia. Swift Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 2 z 4.

Ile czasu zajmuje lekcja „matchedGeometryEffect dla przejść typu Hero”?

Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.

Czy mogę pisać i uruchamiać kod w tej lekcji Swift Academy?

Tak. Każda lekcja Swift Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.

Wszystkie lekcje w tym kursie

  1. Animacje niejawne a jawne
  2. matchedGeometryEffect dla przejść typu Hero
  3. Niestandardowy AnimatableModifier i Animatable
  4. TimelineView i Canvas do wydajnego rysowania
← Powrót do Swift Academy