0Pricing
Swift Academy · Lección

AnimatableModifier y Animatable personalizados

Anime contenido dibujado personalizado ajustándose a Animatable y AnimatableModifier.

AnimatableModifier y Animatable personalizados es una lección gratuita de Swift Academy en CoddyKit. Esta es la lección 3 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de Swift Academy, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de Swift Academy incluye 4 lecciones en total.

El protocolo Animatable

Animatable indica a SwiftUI cómo interpolar un tipo durante una animación. Las formas se ajustan a él automáticamente.

struct Wave: Shape, Animatable {
  var amplitude: Double
  var animatableData: Double {
    get { amplitude }
    set { amplitude = newValue }
  }
  func path(in rect: CGRect) -> Path { Path() }
}

Propiedad animatableData

SwiftUI lee y escribe animatableData en cada fotograma de la animación para interpolar entre los valores inicial y final.

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 para varios valores

Use AnimatablePair para animar simultáneamente dos valores independientes.

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

Al hacer que un ViewModifier se ajuste a Animatable, podrá animar efectos visuales arbitrarios.

struct Shake: ViewModifier, Animatable {
  var animatableData: Double = 0
  func body(content: Content) -> some View {
    content.offset(x: sin(animatableData * .pi * 4) * 8)
  }
}

Control de la animación

Cambie el valor animable dentro de withAnimation y SwiftUI lo interpolará mediante 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 (obsoleto) frente a Animatable + ViewModifier

AnimatableModifier está obsoleto en los SDK posteriores. Prefiera hacer que su ViewModifier se ajuste directamente a Animatable.

// Modern approach:
struct MyMod: ViewModifier, Animatable { ... }
// Avoid (deprecated):
// struct MyMod: AnimatableModifier { ... }

Tipos numéricos personalizados como animatableData

Cualquier tipo que se ajuste a VectorArithmetic puede utilizarse como animatableData. CGFloat, Double y AnimatablePair de Swift cumplen este requisito.

extension MyColor: VectorArithmetic {
  static func += (lhs: inout MyColor, rhs: MyColor) { ... }
  mutating func scale(by rhs: Double) { ... }
  var magnitudeSquared: Double { ... }
}

Modificador basado en el progreso

Un patrón habitual consiste en animar un valor de progress de 0 a 1 y calcular las propiedades visuales dentro del modificador.

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))
  }
}

Encadenamiento con .animation

Asocie una animación para actualizar automáticamente el valor de progreso del modificador animable cuando cambie el estado.

Text("Loading")
  .modifier(FillModifier(progress: isLoaded ? 1 : 0))
  .animation(.easeInOut(duration: 1.0), value: isLoaded)

Animación de formas personalizadas

El uso más potente consiste en transformar una forma de trayectoria en otra mediante la interpolación de sus puntos de control a través de 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()
  }
}

Rendimiento

SwiftUI llama al cuerpo del modificador en cada fotograma de la animación. Mantenga al mínimo los cálculos dentro de body para obtener una animación fluida a 60/120 fps.

// OK: simple math in body
// AVOID: network calls, heavy computation in animated body

Comprobación rápida

¿Qué lee y escribe SwiftUI en cada fotograma de la animación para interpolar un tipo animable personalizado?

Resumen de la lección

Haga que las formas o los modificadores de vista se ajusten a Animatable y expongan animatableData (un valor de VectorArithmetic). SwiftUI lo interpola en cada fotograma. Use AnimatablePair para dos valores. Controle la animación con withAnimation o .animation.

Preguntas frecuentes

¿La lección «AnimatableModifier y Animatable personalizados» es gratis?

Sí — el texto completo de «AnimatableModifier y Animatable personalizados» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de Swift Academy, actualiza a CoddyKit PRO. El curso de Swift Academy incluye 4 lecciones en total.

¿Qué aprenderé en «AnimatableModifier y Animatable personalizados»?

Anime contenido dibujado personalizado ajustándose a Animatable y AnimatableModifier. Practicas Swift Academy con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.

¿Necesito experiencia previa para empezar Swift Academy?

No se requiere experiencia previa. Swift Academy en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 3 de 4.

¿Cuánto tiempo toma la lección «AnimatableModifier y Animatable personalizados»?

La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.

¿Puedo escribir y ejecutar código en esta lección de Swift Academy?

Sí. Cada lección de Swift Academy incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.

Todas las lecciones de este curso

  1. Animaciones implícitas frente a explícitas
  2. matchedGeometryEffect para transiciones hero
  3. AnimatableModifier y Animatable personalizados
  4. TimelineView y Canvas para dibujo de alto rendimiento
← Volver a Swift Academy