AnimatableModifier e Animatable personalizzati
Animare contenuti disegnati personalizzati conformandoli a Animatable e AnimatableModifier.
AnimatableModifier e Animatable personalizzati è una lezione Swift Academy gratuita su CoddyKit. Questa è la lezione 3 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento Swift Academy, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso Swift Academy include 4 lezioni in totale.
Il protocollo Animatable
Animatable indica a SwiftUI come interpolare un tipo durante un'animazione. Le forme lo implementano automaticamente.
struct Wave: Shape, Animatable {
var amplitude: Double
var animatableData: Double {
get { amplitude }
set { amplitude = newValue }
}
func path(in rect: CGRect) -> Path { Path() }
}Proprietà animatableData
SwiftUI legge e scrive animatableData a ogni fotogramma dell'animazione per interpolare i valori iniziali e finali.
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 per più valori
Utilizzi AnimatablePair per animare simultaneamente due valori indipendenti.
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
Conformando un ViewModifier a Animatable, può animare effetti visivi arbitrari.
struct Shake: ViewModifier, Animatable {
var animatableData: Double = 0
func body(content: Content) -> some View {
content.offset(x: sin(animatableData * .pi * 4) * 8)
}
}Controllo dell'animazione
Modifichi il valore animabile all'interno di withAnimation e SwiftUI eseguirà l'interpolazione tramite 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 (deprecato) rispetto a Animatable + ViewModifier
AnimatableModifier è deprecato negli SDK più recenti. È preferibile conformare direttamente il proprio ViewModifier a Animatable.
// Modern approach:
struct MyMod: ViewModifier, Animatable { ... }
// Avoid (deprecated):
// struct MyMod: AnimatableModifier { ... }Tipi numerici personalizzati come animatableData
Qualsiasi tipo conforme a VectorArithmetic può essere usato come animatableData. I tipi CGFloat, Double e AnimatablePair di Swift soddisfano tutti questo requisito.
extension MyColor: VectorArithmetic {
static func += (lhs: inout MyColor, rhs: MyColor) { ... }
mutating func scale(by rhs: Double) { ... }
var magnitudeSquared: Double { ... }
}Modificatore basato sull'avanzamento
Un modello comune consiste nell'animare un valore progress da 0 a 1 e calcolare le proprietà visive all'interno del modificatore.
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))
}
}Concatenazione con .animation
Applichi un'animazione per aggiornare automaticamente il valore di avanzamento del modificatore animabile quando cambia lo stato.
Text("Loading")
.modifier(FillModifier(progress: isLoaded ? 1 : 0))
.animation(.easeInOut(duration: 1.0), value: isLoaded)Animazione di forme personalizzate
L'uso più potente consiste nel trasformare una forma di percorso in un'altra interpolando i punti di controllo tramite 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()
}
}Prestazioni
SwiftUI richiama il corpo del modificatore a ogni fotogramma dell'animazione. Mantenga al minimo i calcoli all'interno di body per ottenere 60/120 fps fluidi.
// OK: simple math in body
// AVOID: network calls, heavy computation in animated bodyVerifica rapida
Che cosa legge e scrive SwiftUI a ogni fotogramma dell'animazione per interpolare un tipo animabile personalizzato?
Riepilogo della lezione
Renda le forme o i modificatori di vista conformi a Animatable ed esponga animatableData (un valore VectorArithmetic). SwiftUI lo interpola a ogni fotogramma. Utilizzi AnimatablePair per due valori. Avvii l'animazione con withAnimation o .animation.
Domande Frequenti
La lezione «AnimatableModifier e Animatable personalizzati» è gratuita?
Sì — il testo completo di «AnimatableModifier e Animatable personalizzati» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso Swift Academy, passa a CoddyKit PRO. Il corso Swift Academy include 4 lezioni in totale.
Cosa imparerò in «AnimatableModifier e Animatable personalizzati»?
Animare contenuti disegnati personalizzati conformandoli a Animatable e AnimatableModifier. Eserciti Swift Academy con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.
Ho bisogno di esperienza per iniziare Swift Academy?
Non è richiesta alcuna esperienza precedente. Swift Academy su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 3 di 4.
Quanto tempo richiede la lezione «AnimatableModifier e Animatable personalizzati»?
La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.
Posso scrivere ed eseguire codice in questa lezione Swift Academy?
Sì. Ogni lezione Swift Academy include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.
Tutte le lezioni di questo corso
- Animazioni implicite ed esplicite
- matchedGeometryEffect per transizioni hero
- AnimatableModifier e Animatable personalizzati
- TimelineView e Canvas per il disegno ad alte prestazioni