Depois de girar uma caligia usando Cabasicanimation, a camada salta de volta para sua posição não rotativa
-
21-09-2019 - |
Pergunta
Estou tentando criar uma moeda em queda. A imagem da moeda é uma calayer com 2imações de cabasicanções - uma queda e uma rotação. Quando a animação caindo ao fim, ela fica lá. A animação de rotação, porém, que deveria ser aleatória e acabar em um ângulo diferente todas as vezes, apenas volta à imagem original da calayer.
Eu quero que fique no ângulo em que terminou a animação. É possível? Como eu faço isso?
Código:
//Moving down animation:
CABasicAnimation *anim = [CABasicAnimation animationWithKeyPath:@"transform.translation.y"];
anim.duration = 1;
anim.autoreverses = NO;
anim.removedOnCompletion = YES;
anim.fromValue = [NSNumber numberWithInt: -80 - row_height * (8 - _col)];
anim.toValue = [NSNumber numberWithInt: 0];
//Rotation Animation:
CABasicAnimation *rota = [CABasicAnimation animationWithKeyPath:@"transform.rotation"];
rota.duration = 4;
rota.autoreverses = NO;
rota.removedOnCompletion = NO;
rota.fromValue = [NSNumber numberWithFloat: 0];
rota.toValue = [NSNumber numberWithFloat: 2.5 * 3.15 ];
[cl addAnimation: rota forKey: @"rotation"];
[cl addAnimation: anim forKey: @"animateFalling"];
Solução
Você definiu a propriedade RemovedOnCompletion da animação de rotação para não, por exemplo,
rota.removedOnCompletion = NO;
Isso deve deixar a camada de apresentação onde estava quando a animação terminou. O padrão é sim, que voltará ao valor do modelo, ou seja, o comportamento que você descreve.
O modo de enchimento também deve ser definido, ou seja,
rota.fillMode = kCAFillModeForwards;
Outras dicas
Eu estava tentando girar uma flecha para frente e para trás, como o efeito "Pull To Atualize" do Twitter/Facebook.
O problema é que eu estava fazendo a rotação para frente e para trás no mesmo uiview, então depois de adicionar
rotation.removedOnCompletion = NO;
rotation.fillMode = kCAFillModeForwards;
A guerra de animação avançada funcionando bem, mas a animação para trás não estava funcionando.
Então eu adicionei a última linha sugerida por YehenDixon e, além disso, defina a transformação da visualização no estado concluído da animação: (rotação em 180 graus)
[myview.layer removeAllAnimations];
myView.transform = CGAffineTransformMakeRotation(M_PI);
Para a animação 'Restauração' (para trás), faço isso na conclusão:
myView.transform = CGAffineTransformMakeRotation(0);
... e funciona bem. De alguma forma, isso não precisa da chamada de remoção de remoções.
Eu descobri isso configurando: removedOnCompletion = NO;
Não produziu um vazamento visível em instrumentos, mas não foi desalocado e estava acumulando uma pequena quantidade de memória. Idk se é minha implementação ou o quê, mas adicionando removelações removidas no final da animação parecia esclarecer esse pouquinho de memória residual.
[myview.layer removeAllAnimations];