Niestandardowy AnimatableModifier i Animatable
Animowanie własnoręcznie rysowanej zawartości przez zapewnienie zgodności z Animatable i AnimatableModifier.
Niestandardowy AnimatableModifier i Animatable to bezpłatna lekcja Swift Academy na CoddyKit. To lekcja 3 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.
Protokół Animatable
Animatable określa dla SwiftUI sposób interpolowania typu podczas animacji. Figury automatycznie implementują ten protokół.
struct Wave: Shape, Animatable {
var amplitude: Double
var animatableData: Double {
get { amplitude }
set { amplitude = newValue }
}
func path(in rect: CGRect) -> Path { Path() }
}Właściwość animatableData
SwiftUI odczytuje i zapisuje animatableData w każdej klatce animacji, aby interpolować wartości początkowe i końcowe.
struct GrowingCircle: Shape {
var radius: Double
var animatableData: Double {
get { radius }
set { radius = newValue }
}
func path(in rect: CGRect) -> Path {
Path(ellipseIn: CGRect(x: rect.midX-radius, y: rect.midY-radius, width: radius*2, height: radius*2))
}
}AnimatablePair dla wielu wartości
Użyj AnimatablePair, aby jednocześnie animować dwie niezależne wartości.
struct Sector: Shape {
var startAngle: Double, endAngle: Double
var animatableData: AnimatablePair<Double, Double> {
get { AnimatablePair(startAngle, endAngle) }
set { startAngle = newValue.first; endAngle = newValue.second }
}
func path(in rect: CGRect) -> Path { Path() }
}ViewModifier + Animatable
Implementacja protokołu Animatable przez ViewModifier pozwala animować dowolne efekty wizualne.
struct Shake: ViewModifier, Animatable {
var animatableData: Double = 0
func body(content: Content) -> some View {
content.offset(x: sin(animatableData * .pi * 4) * 8)
}
}Sterowanie animacją
Zmień wartość animowalną wewnątrz withAnimation, a SwiftUI wykona interpolację za pośrednictwem animatableData.
struct ShakeView: View {
@State private var shakes = 0.0
var body: some View {
Text("Hello")
.modifier(Shake(animatableData: shakes))
.onTapGesture {
withAnimation(.linear(duration: 0.5)) { shakes += 1 }
}
}
}AnimatableModifier (przestarzały) a Animatable + ViewModifier
AnimatableModifier jest przestarzały w nowszych zestawach SDK. Zamiast tego bezpośrednio dostosuj swój ViewModifier do protokołu Animatable.
// Modern approach:
struct MyMod: ViewModifier, Animatable { ... }
// Avoid (deprecated):
// struct MyMod: AnimatableModifier { ... }Niestandardowe typy liczbowe jako animatableData
Dowolny typ implementujący VectorArithmetic może być używany jako animatableData. Swiftowe typy CGFloat, Double i AnimatablePair spełniają ten warunek.
extension MyColor: VectorArithmetic {
static func += (lhs: inout MyColor, rhs: MyColor) { ... }
mutating func scale(by rhs: Double) { ... }
var magnitudeSquared: Double { ... }
}Modyfikator oparty na postępie
Typowy wzorzec polega na animowaniu wartości progress od 0 do 1 i obliczaniu właściwości wizualnych wewnątrz modyfikatora.
struct FillModifier: ViewModifier, Animatable {
var progress: Double
var animatableData: Double { get { progress } set { progress = newValue } }
func body(content: Content) -> some View {
content.overlay(Color.blue.opacity(progress))
}
}Łączenie z .animation
Dołącz animację, aby automatycznie sterować wartością postępu animowalnego modyfikatora podczas zmian stanu.
Text("Loading")
.modifier(FillModifier(progress: isLoaded ? 1 : 0))
.animation(.easeInOut(duration: 1.0), value: isLoaded)Animowanie niestandardowych figur
Najbardziej zaawansowane zastosowanie polega na morfingu między dwiema figurami ścieżek przez interpolowanie punktów kontrolnych za pomocą animatableData.
struct Blob: Shape, Animatable {
var bulge: Double
var animatableData: Double { get { bulge } set { bulge = newValue } }
func path(in rect: CGRect) -> Path {
// compute bezier with bulge-adjusted control points
Path()
}
}Wydajność
SwiftUI wywołuje treść modyfikatora w każdej klatce animacji. Aby uzyskać płynne 60/120 kl./s, ogranicz do minimum obliczenia wykonywane w treści.
// OK: simple math in body
// AVOID: network calls, heavy computation in animated bodySzybkie sprawdzenie
Co SwiftUI odczytuje i zapisuje w każdej klatce animacji, aby interpolować niestandardowy typ animowalny?
Podsumowanie lekcji
Dostosuj figury lub modyfikatory widoku do protokołu Animatable i udostępnij animatableData (wartość typu VectorArithmetic). SwiftUI interpoluje ją w każdej klatce. Użyj AnimatablePair dla dwóch wartości. Steruj animacją za pomocą withAnimation lub .animation.
Często zadawane pytania
Czy lekcja „Niestandardowy AnimatableModifier i Animatable” jest bezpłatna?
Tak — pełny tekst „Niestandardowy AnimatableModifier i Animatable” 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 „Niestandardowy AnimatableModifier i Animatable”?
Animowanie własnoręcznie rysowanej zawartości przez zapewnienie zgodności z Animatable i AnimatableModifier. Ć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 3 z 4.
Ile czasu zajmuje lekcja „Niestandardowy AnimatableModifier i Animatable”?
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