0Pricing
Swift Academy · Lezione

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 body

Verifica 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

  1. Animazioni implicite ed esplicite
  2. matchedGeometryEffect per transizioni hero
  3. AnimatableModifier e Animatable personalizzati
  4. TimelineView e Canvas per il disegno ad alte prestazioni
← Torna a Swift Academy