0Pricing
Swift Academy · Lekcja

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 body

Szybkie 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

  1. Animacje niejawne a jawne
  2. matchedGeometryEffect dla przejść typu Hero
  3. Niestandardowy AnimatableModifier i Animatable
  4. TimelineView i Canvas do wydajnego rysowania
← Powrót do Swift Academy