iOS CAKeyframeAnimation rotationMode on UIImageView

Estou experimentando a animação do quadro-chave da posição de um objeto UIImageView se movendo ao longo de um caminho de bezier. Esta foto mostra o estado inicial antes da animação. A linha azul é o caminho - movendo-se inicialmente para cima, a caixa verde clara é a caixa delimitadora inicial ou a imagem e o "fantasma" verde escuro é a imagem que estou movendo:

Quando inicio a animação com rotationMode definido comonil, a imagem mantém a mesma orientação por todo o caminho, conforme o esperad

Mas quando inicio a animação com rotationMode definido comokCAAnimationRotateAuto, a imagem gira imediatamente 90 graus no sentido anti-horário e mantém essa orientação por todo o caminho. Quando chega ao final do caminho, ele redesenha novamente na orientação correta (na verdade, mostra o UIImageView que reposicionei no local final)

Eu esperava ingenuamente que o rotationMode orientasse a imagem para a tangente do caminho e não para o normal, especialmente quando a Apple documenta oCAKeyframeAnimation rotationMode Estad

Determina se os objetos animados ao longo do caminho são rotacionados para coincidir com a tangente do caminh

Então, qual é a solução aqui? Preciso girar a imagem 90 graus no sentido horário? Ou há algo que estou perdendo?

Obrigado pela ajuda

Edit 2 de março

Adicionei uma etapa de rotação antes da animação do caminho usando uma rotação Affine como:

theImage.transform = CGAffineTransformRotate(theImage.transform,90.0*M_PI/180);

e depois da animação do caminho, redefinindo a rotação com:

theImage.transform = CGAffineTransformIdentity;

Isso faz com que a imagem siga o caminho da maneira esperada. No entanto, agora estou enfrentando um problema diferente de tremulação da imagem. Eu já estou procurando uma solução para o problema de oscilação nesta pergunta do SO:

escala do @iOS CAKeyFrameAnimation pisca no final da animação

Então agora não sei se tornei as coisas melhores ou piores!

Editar 12 de março

Enquanto Caleb apontou que sim, eu tive que pré-girar minha imagem, Rob forneceu um pacote incrível de código que quase resolveu completamente meus problemas. A única coisa que Rob não fez foi compensar meus recursos sendo desenhados com uma orientação vertical em vez de horizontal, portanto ainda exigindo pré-rotacioná-los 90 graus antes de fazer a animação. Mas ei, é justo que eu tenha que fazer parte do trabalho para que as coisas funcione

Então, minhas pequenas alterações na solução de Rob da suíteme os requisitos são:

Quando adiciono o UIView, giro-o previamente para contrariar a rotação inerente adicionada definindo orotationMode:

theImage.transform = CGAffineTransformMakeRotation (90 * M_PI / 180.0);

Preciso manter essa rotação no final da animação, então, em vez de apenas explodir a transformação da vista com um novo fator de escala após a definição do bloco de conclusão, construo a escala com base na transformação atual:

theImage.transform = CGAffineTransformScale (theImage.transform, scaleFactor, scaleFactor);

E foi tudo o que eu precisei fazer para que minha imagem seguisse o caminho como eu esperava!

Edit 22 de março

Acabei de carregar no GitHub um projeto de demonstração que mostra a movimentação de um objeto ao longo de um caminho de bezier. O código pode ser encontrado em PathMove

Eu também escrevi sobre isso no meu blog em Movendo objetos ao longo de um caminho de bezier no iOS

questionAnswers(6)

yourAnswerToTheQuestion