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 togglingWskazó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 frameSzybkie 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
- Animacje niejawne a jawne
- matchedGeometryEffect dla przejść typu Hero
- Niestandardowy AnimatableModifier i Animatable
- TimelineView i Canvas do wydajnego rysowania