SwiftUI Series 09|Introdução à animação SwiftUI: uso de animação e withAnimation
O que realmente precisa ser diferenciado é se a animação está anexada à mudança de estado ou se precisa ser explicitamente encapsulada para uma mudança específica.
É mais provável que a animação SwiftUI dê às pessoas uma sensação “aparentemente simples”:
- Adicionar
.animation - Ou embale
withAnimation
A página começa a se mover.
Mas em projetos reais, o problema mais comum com animação está exatamente aqui:
- Está se mudando para cá também.
- As coisas mudaram para onde não deveriam.
- Não há animação para uma determinada mudança de estado
- A animação fica particularmente estranha quando a lista é atualizada
Isso mostra que muitas vezes não descobrimos primeiro:
Esta animação deveria ser anexada a uma determinada mudança de estado ou deveria apenas encerrar um processo de mudança específico?
1. O núcleo da animação SwiftUI é “permitir que as mudanças de estado sejam interpoladas e apresentadas”
Isto é particularmente importante.
Se você ainda usa ideias do UIKit para entender a animação, é fácil definir como padrão:
- Quero fazer um certo movimento de controle
SwiftUI é mais parecido com fazer:
- Quando o estado muda de A para B, use animação para expressar o processo de mudança
Isso significa que as animações dependem naturalmente de mudanças de estado. Então o que realmente precisa ser julgado é:
- Quais mudanças de estado merecem ser animadas?
- Qual deve ser o tamanho do escopo da animação?
2. A diferença entre .animation e withAnimation não é apenas o método de escrita, mas a granularidade do controle.
Uma compreensão mais prática é:
.animationé mais como anexar animação a certos tipos de mudanças de estado.withAnimationé mais como envolver explicitamente uma modificação de estado específica
Então, ao usar .animation, é mais como dizer:
Esta visualização deve ter reações de animação por padrão para determinadas mudanças de estado.
E withAnimation é mais como dizer:
Vou fazer essa mudança de estado agora e quero que essa mudança seja animada.
Esta distinção é crítica porque afeta diretamente a controlabilidade da animação.
3. Muitas animações de página “se moverão juntas inexplicavelmente”
A razão mais comum é que o âmbito de ação não está fechado.
Por exemplo, originalmente eu queria apenas um bloco expandido para animar, mas o resultado é:
- Outros textos na mesma camada também se movem de acordo
- A mudança de altura do contêiner pai faz com que toda a área seja animada
- Alguns layouts irrelevantes também começaram a transitar
Geralmente, isso ocorre quando a animação está anexada a uma mudança de estado ou hierarquia de visualização muito grande.
Então, quando a animação está bagunçada, o que eu mais volto para verificar é:
- Por quais mudanças esta camada é atualmente responsável?
- A animação está vinculada a uma visualização muito grande?
- A alteração do status afeta muitos resultados de layout ao mesmo tempo?
4. Muitas “animações não são bonitas” porque a modelagem do estado não é clara.
Algumas animações parecem estranhas e são:
- O estado em si não está claramente concebido
- Uma alteração altera muitos valores ao mesmo tempo
- O nível de layout da página está instável
Por exemplo, um clique aciona ao mesmo tempo:
- Expandir
- Troca de redação
- Mudanças de altitude
- Reorganização da lista
Isso acaba parecendo confuso, muitas vezes com muitas mudanças semânticas diferentes espremidas na mesma transição de estado.
5. Quando é mais adequado usar withAnimation
Eu prefiro usá-lo nestes cenários:
- Uma ação do usuário aciona uma mudança de estado explícita
- Eu só quero que a mudança de estado seja animada desta vez
- Quero controlar explicitamente “se esta alteração deve ser movida ou não”
Por exemplo:
- Expandir/Recolher
- Inserir/excluir um bloco parcial
- Mude um determinado estado de apresentação após clicar
A vantagem é que a semântica é mais clara: Saiba que a animação está diretamente ligada a esta ação.
6. Quando é provável que .animation seja mais perigoso?
.animation é particularmente fácil de fazer com que a página “se mova ligeiramente para qualquer lugar” quando o escopo de influência do status não é claramente pensado primeiro.
Especialmente em layouts complexos, se uma mudança de estado afetar:
- Dimensões
- Alinhamento
- redação
- Hierarquia de contêineres
Pendurar a animação diretamente nele pode facilmente causar a transição de toda a área.
Portanto, .animation é mais adequado para aqueles:
- O escopo de influência é relativamente claro
- Semântica simples de mudanças de estado
- Estabilidade da área local
cena.
7. Um julgamento mais prático: esta animação está expressando “uma ação” ou modificando “um tipo de mudança” por padrão?
Se você estiver expressando uma ação explícita:
- Clique para abrir
- fechar
- Inserir
- Excluir
Então geralmente considero withAnimation primeiro.
Se você estiver modificando uma mudança de estado local estável, será mais fácil considerar .animation.
Este julgamento é muito útil porque permite que você não se concentre apenas no nome da API, mas realmente retorne à própria “semântica da animação”.
8. Conclusão: O que realmente precisa ser diferenciado na animação SwiftUI é o limite das mudanças de estado e o limite dos efeitos de animação.
Para resumir, eu diria:
O mais importante sobre a animação SwiftUI é primeiro distinguir: se esta animação está expressando uma ação específica ou se está adicionando um efeito de transição a algum tipo de mudança de estado local.
Uma vez claros esses dois limites, a animação será mais controlável; Se os limites não forem claros, a página pode facilmente “se mover para todos os lugares, mas nenhum lugar está se movendo particularmente certo”.
What to read next
Want more posts about SwiftUI?
Posts in the same category are usually the best next step for reading more on this topic.
View same categoryWant to keep following #iOS?
Tags are useful for related tools, specific problems, and similar troubleshooting notes.
View same tagWant to explore another direction?
If you are not sure what to read next, return to the homepage and start from categories, topics, or latest updates.
Back home