0Pricing
Swift Academy · Aula

AnimatableModifier e Animatable personalizados

Anime conteúdo desenhado personalizado adotando Animatable e AnimatableModifier.

AnimatableModifier e Animatable personalizados é uma aula grátis de Swift Academy no CoddyKit. Esta é a aula 3 de 4. Você pode ler a aula completa abaixo gratuitamente — depois pratica ao vivo no navegador com um editor de código integrado e um tutor de IA 24/7. Faz parte do caminho de aprendizado de Swift Academy, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de Swift Academy inclui 4 aulas no total.

O protocolo Animatable

Animatable informa ao SwiftUI como interpolar um tipo durante uma animação. As formas adotam esse protocolo automaticamente.

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

Propriedade animatableData

O SwiftUI lê e grava animatableData a cada quadro da animação para interpolar os valores inicial e 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 vários valores

Use AnimatablePair para animar dois valores independentes simultaneamente.

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

Fazer um ViewModifier estar em conformidade com Animatable permite animar efeitos visuais arbitrários.

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

Controlando a animação

Altere o valor animável dentro de withAnimation, e o SwiftUI fará a interpolação por meio de 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) versus Animatable + ViewModifier

AnimatableModifier está obsoleto em SDKs mais recentes. Prefira fazer seu ViewModifier estar diretamente em conformidade com Animatable.

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

Tipos numéricos personalizados como animatableData

Qualquer tipo em conformidade com VectorArithmetic pode ser usado como animatableData. CGFloat, Double e AnimatablePair do Swift atendem a esse requisito.

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

Modificador baseado no progresso

Um padrão comum é animar um valor de progress de 0 a 1 e calcular as propriedades visuais dentro do 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))
  }
}

Encadeando com .animation

Associe uma animação para atualizar automaticamente o valor de progresso do modificador animável quando o estado mudar.

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

Animando formas personalizadas

O uso mais poderoso é transformar gradualmente uma forma de caminho em outra, interpolando os pontos de controle por meio 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()
  }
}

Desempenho

O SwiftUI chama o corpo do modificador a cada quadro da animação. Mantenha os cálculos dentro de body mínimos para obter uma animação fluida a 60/120 fps.

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

Verificação rápida

O que o SwiftUI lê e grava a cada quadro da animação para interpolar um tipo animável personalizado?

Recapitulação da lição

Faça com que formas ou modificadores de visualização estejam em conformidade com Animatable e exponham animatableData (um valor de VectorArithmetic). O SwiftUI faz a interpolação a cada quadro. Use AnimatablePair para dois valores. Controle a animação com withAnimation ou .animation.

Perguntas Frequentes

A aula “AnimatableModifier e Animatable personalizados” é grátis?

Sim — o texto completo de “AnimatableModifier e Animatable personalizados” é grátis para ler aqui na web. Para praticá-la interativamente (um editor de código integrado e um tutor de IA 24/7) e desbloquear o restante do curso de Swift Academy, atualize para CoddyKit PRO. O curso de Swift Academy inclui 4 aulas no total.

O que vou aprender em “AnimatableModifier e Animatable personalizados”?

Anime conteúdo desenhado personalizado adotando Animatable e AnimatableModifier. Você pratica Swift Academy com código prático que executa diretamente no navegador, e um tutor de IA 24/7 responde suas dúvidas enquanto trabalha na aula.

Preciso ter experiência prévia para começar Swift Academy?

Nenhuma experiência prévia é necessária. Swift Academy no CoddyKit é estruturado para alunos iniciantes até avançados, então você pode começar aqui ou desde o início e aprender no seu ritmo. Esta é a aula 3 de 4.

Quanto tempo leva a aula “AnimatableModifier e Animatable personalizados”?

A maioria das aulas CoddyKit leva cerca de 5–10 minutos. Cada uma é compacta e interativa, então você faz progresso constante e retoma exatamente de onde parou entre web e app.

Posso escrever e executar código nesta aula de Swift Academy?

Sim. Cada aula de Swift Academy inclui um editor de código integrado, então você escreve e executa código real direto no navegador e recebe feedback de IA instantaneamente — nenhuma configuração local necessária.

Todas as aulas deste curso

  1. Animações implícitas e explícitas
  2. matchedGeometryEffect para transições hero
  3. AnimatableModifier e Animatable personalizados
  4. TimelineView e Canvas para desenho de alto desempenho
← Voltar para Swift Academy