¿Puedo usar CGAffineTransformMakeRotation para rotar una vista más de 360 ​​grados?

Resuelto bwinton asked hace 15 años • 3 respuestas

Estoy escribiendo una aplicación para iPhone y tengo una imagen que me gustaría que se arremolinara hacia afuera.

Actualmente mi código se ve así (envuelto en un bloque BeginAnimations/commitAnimations):

scale = CGAffineTransformScale(CGAffineTransformIdentity, 5.0f, 5.0f);
swirl = CGAffineTransformRotate(scale, M_PI);
[player setTransform:swirl];    
[player setAlpha:0.0f];

Pero encuentro que si intento cambiar el ángulo de rotación a, digamos, 4*M_PI, no gira en absoluto. ¿Es posible obtener una rotación de 720˚ usando CGAffineTransformRotate o tengo que cambiar a otra tecnología?

Si tengo que cambiar a otra tecnología, ¿recomendarías usar otro hilo (o un temporizador) para hacer la animación yo mismo, o OpenGL sería una mejor ruta a seguir?

Gracias,
Blake.

bwinton avatar Feb 13 '09 01:02 bwinton
Aceptado

Puedes hacerlo, pero necesitarás dividir tu animación en rotaciones de semicírculo. Proporciono un ejemplo de esto en respuesta a esta pregunta , usando una CABasicAnimation repetida aplicada a la capa debajo de la vista. Como sugiero allí, hacer estas medias rotaciones como partes de CAKeyframeAnimation probablemente sería la mejor manera de estructurar esto, porque la animación sería más suave (hay un ligero problema entre medias rotaciones en mi ejemplo), y podrías hacer una agradable aceleración/desaceleración al principio y al final.

Brad Larson avatar Feb 12 '2009 19:02 Brad Larson

Respuesta al título: Sí, CGAffineTransform puede girar más de 360 ​​grados sin problemas.
Respuesta a la pregunta: Sí, pero no puedes animarlo porque no hay nada que animar.

Recuerde que la transformación afín es una matriz y que una matriz de rotación contiene los números de seno y coseno precalculados . Es como si dijeras:

CGFloat angle = 4.0 * M_PI;
NSAffineTransformStruct matrix = {
    .m11 = cos(angle),
    .m12 = sin(angle),
    .m21 = -sin(angle),
    .m22 = cos(angle),
    .tx = 0.0,
    .ty = 0.0
};
NSAffineTransform *transform = [NSAffineTransform transform];
[transform setTransformStruct:matrix];

Ahora, revisemos algunos valores de muestra para cosy sin:

  • cos(0π)= 1
  • sin(0π)= 0
  • cos(2π)= 1
  • sin(2π)= 0
  • cos(4π)= 1
  • sin(4π)= 0

Recuerde, la matriz no contiene el ángulo, solo contiene el coseno y el seno . Y esos valores no cambian de un múltiplo de un círculo a otro. Por tanto, no hay nada que animar.

(Tenga en cuenta que Calculator.app proporciona resultados incorrectos para cos(xπ) y sin(xπ). Pruebe Grapher, calc o Google ).

Necesitarás dividir la animación en fracciones de círculo. Los semicírculos que sugirió Brad Larson funcionarán bien.

Peter Hosey avatar Feb 12 '2009 22:02 Peter Hosey