rotate rotar que para pantalla hago gire girar como comando celular iphone cocoa-touch core-animation core-graphics

iphone - que - ¿Puedo usar CGAffineTransformMakeRotation para rotar una vista de más de 360 grados?



como hago para que gire la pantalla de mi celular (3)

Estoy escribiendo una aplicación para iPhone, y tengo una imagen que me gustaría girar 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 me parece que si trato de cambiar el ángulo de la rotación a, digamos, 4 * M_PI, no gira en absoluto. ¿Es posible obtener una rotación de 720˚ usando CGAffineTransformRotate, o debo cambiar a otra tecnología?

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

Gracias,
Blake.


Puede girar una vista, por un número de radianes, independientemente de si es menor que una rotación completa o muchos múltiplos de una rotación completa, sin tener que dividir la rotación en partes. Como ejemplo, el siguiente código girará una vista, una vez por segundo, durante un número específico de segundos. Puede modificarlo fácilmente para hacer girar una vista por un cierto número de rotaciones, o por una cierta cantidad de radianes.

- (void) runSpinAnimationWithDuration:(CGFloat) duration; { CABasicAnimation* rotationAnimation; rotationAnimation = [CABasicAnimation animationWithKeyPath:@"transform.rotation.z"]; rotationAnimation.toValue = [NSNumber numberWithFloat: M_PI * 2.0 /* full rotation*/ * rotations * duration ]; rotationAnimation.duration = duration; rotationAnimation.cumulative = YES; rotationAnimation.repeatCount = 1.0; rotationAnimation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseOut]; [myView.layer addAnimation:rotationAnimation forKey:@"rotationAnimation"]; }


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


Respuesta al título: Sí, CGAffineTransform puede rotar más de 360 ​​grados sin problemas.
Respuesta a la pregunta: Sí, pero no se puede animar 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, repasemos algunos valores de muestra para cos y 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 lo tanto, no hay nada para animar.

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

Tendrá que dividir la animación en fracciones de un círculo. Los semicírculos sugeridos por Brad Larson servirán muy bien.