Depois de girar uma caligia usando Cabasicanimation, a camada salta de volta para sua posição não rotativa

StackOverflow https://stackoverflow.com/questions/1376753

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"];
Foi útil?

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];
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top