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 bodyVerificaçã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
- Animações implícitas e explícitas
- matchedGeometryEffect para transições hero
- AnimatableModifier e Animatable personalizados
- TimelineView e Canvas para desenho de alto desempenho