Benutzerdefinierter AnimatableModifier und Animatable
Animieren Sie selbst gezeichnete Inhalte durch Konformität zu Animatable und AnimatableModifier.
Benutzerdefinierter AnimatableModifier und Animatable ist eine kostenlose Swift Academy-Lektion auf CoddyKit. Dies ist Lektion 3 von 4. Du kannst die komplette Lektion unten kostenlos lesen – dann übst du sie direkt im Browser mit einem integrierten Code-Editor und einem KI-Tutor rund um die Uhr. Sie ist Teil des Swift Academy-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der Swift Academy-Kurs umfasst insgesamt 4 Lektionen.
Das Animatable-Protokoll
Animatable teilt SwiftUI mit, wie ein Typ während einer Animation interpoliert werden soll. Shapes entsprechen diesem Protokoll automatisch.
struct Wave: Shape, Animatable {
var amplitude: Double
var animatableData: Double {
get { amplitude }
set { amplitude = newValue }
}
func path(in rect: CGRect) -> Path { Path() }
}Die Eigenschaft animatableData
SwiftUI liest und schreibt animatableData bei jedem Animationsframe, um zwischen den Start- und Endwerten zu interpolieren.
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 für mehrere Werte
Verwenden Sie AnimatablePair, um zwei unabhängige Werte gleichzeitig zu animieren.
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
Wenn Sie einen ViewModifier an Animatable anpassen, können Sie beliebige visuelle Effekte animieren.
struct Shake: ViewModifier, Animatable {
var animatableData: Double = 0
func body(content: Content) -> some View {
content.offset(x: sin(animatableData * .pi * 4) * 8)
}
}Die Animation steuern
Ändern Sie den animierbaren Wert innerhalb von withAnimation, und SwiftUI interpoliert ihn über 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 (veraltet) im Vergleich zu Animatable + ViewModifier
AnimatableModifier ist in neueren SDKs veraltet. Passen Sie Ihren ViewModifier stattdessen direkt an Animatable an.
// Modern approach:
struct MyMod: ViewModifier, Animatable { ... }
// Avoid (deprecated):
// struct MyMod: AnimatableModifier { ... }Benutzerdefinierte Zahlentypen als animatableData
Jeder Typ, der VectorArithmetic entspricht, kann als animatableData verwendet werden. Swift-Typen wie CGFloat, Double und AnimatablePair erfüllen diese Voraussetzung.
extension MyColor: VectorArithmetic {
static func += (lhs: inout MyColor, rhs: MyColor) { ... }
mutating func scale(by rhs: Double) { ... }
var magnitudeSquared: Double { ... }
}Modifier auf Fortschrittsbasis
Ein gängiges Muster: Animieren Sie einen progress-Wert von 0 bis 1, und berechnen Sie die visuellen Eigenschaften innerhalb des Modifiers.
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))
}
}Mit .animation verketten
Fügen Sie eine Animation hinzu, damit der Fortschrittswert des animierbaren Modifiers bei Zustandsänderungen automatisch gesteuert wird.
Text("Loading")
.modifier(FillModifier(progress: isLoaded ? 1 : 0))
.animation(.easeInOut(duration: 1.0), value: isLoaded)Benutzerdefinierte Shapes animieren
Die leistungsfähigste Anwendung: Verformen Sie eine Pfadform in eine andere, indem Sie die Kontrollpunkte über animatableData interpolieren.
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()
}
}Leistung
SwiftUI ruft den Body des Modifiers bei jedem Animationsframe auf. Halten Sie die Berechnung innerhalb von body minimal, damit die Animation mit flüssigen 60/120 fps läuft.
// OK: simple math in body
// AVOID: network calls, heavy computation in animated bodyKurze Überprüfung
Was liest und schreibt SwiftUI bei jedem Animationsframe, um einen benutzerdefinierten animierbaren Typ zu interpolieren?
Zusammenfassung der Lektion
Passen Sie Shapes oder ViewModifier an Animatable an, und stellen Sie animatableData (einen VectorArithmetic-Wert) bereit. SwiftUI interpoliert diesen Wert in jedem Frame. Verwenden Sie AnimatablePair für zwei Werte. Steuern Sie die Animation mit withAnimation oder .animation.
Häufig gestellte Fragen
Ist die Lektion „Benutzerdefinierter AnimatableModifier und Animatable“ kostenlos?
Ja — der vollständige Text von „Benutzerdefinierter AnimatableModifier und Animatable“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des Swift Academy-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der Swift Academy-Kurs umfasst insgesamt 4 Lektionen.
Was lerne ich in „Benutzerdefinierter AnimatableModifier und Animatable“?
Animieren Sie selbst gezeichnete Inhalte durch Konformität zu Animatable und AnimatableModifier. Du übst Swift Academy mit praktischem Code, den du direkt im Browser ausführst, und ein 24/7 KI-Tutor beantwortet deine Fragen während du die Lektion bearbeitest.
Brauche ich Erfahrung, um Swift Academy zu starten?
Keine Vorkenntnisse erforderlich. Swift Academy auf CoddyKit ist für Anfänger bis fortgeschrittene Lernende strukturiert, sodass du hier starten oder von Anfang an beginnen und in deinem eigenen Tempo voranschreiten kannst. Dies ist Lektion 3 von 4.
Wie lange dauert die Lektion „Benutzerdefinierter AnimatableModifier und Animatable“?
Die meisten CoddyKit-Lektionen dauern etwa 5–10 Minuten. Jede ist kompakt und interaktiv, sodass du stetig Fortschritte machst und genau dort weitermachst, wo du aufgehört hast – im Web und in der App.
Kann ich in dieser Swift Academy-Lektion Code schreiben und ausführen?
Ja. Jede Swift Academy-Lektion enthält einen integrierten Code-Editor, sodass du echten Code direkt in deinem Browser schreibst und ausführst und sofort KI-Feedback erhältst — ohne lokale Einrichtung erforderlich.
Alle Lektionen in diesem Kurs
- Implizite vs. explizite Animationen
- matchedGeometryEffect für Hero-Übergänge
- Benutzerdefinierter AnimatableModifier und Animatable
- TimelineView und Canvas für leistungsstarkes Zeichnen