2009-07-19 9 views
9

Estoy girando una vista con esto:¿Cómo puedo aplicar una dirección específica (es decir, en sentido horario) de rotación en Core Animation?

CGAffineTransform rotatedTransform = CGAffineTransformRotate(CGAffineTransformIdentity, rotationValue); 

Tengo un objeto que quiero girar alrededor de unos 320 grados. Ahora Core Animation es inteligente y solo lo rota tanto como sea necesario, haciendo eso al rotarlo con -40 grados. Entonces el objeto gira al revés con una cantidad más corta de movimiento.

Quiero restringirlo para que gire en el sentido de las agujas del reloj. ¿Tendría que hacer eso cambiando las animaciones en pequeños pasos, o hay una manera más elegante?

Respuesta

18

El siguiente fragmento gira una vista llamada mediante el uso de la animación con marco de teclas. La animación consiste en 3 cuadros repartidos en 1 segundo, con la vista girada a 0º, 180º y 360º en el primer, segundo y último fotograma, respectivamente. El código es el siguiente:

CALayer* layer = someView.layer; 
CAKeyframeAnimation* animation; 
animation = [CAKeyframeAnimation animationWithKeyPath:@"transform.rotation.z"]; 

animation.duration = 1.0; 
animation.cumulative = YES; 
animation.repeatCount = 1; 
animation.removedOnCompletion = NO; 
animation.fillMode = kCAFillModeForwards; 

animation.values = [NSArray arrayWithObjects: 
    [NSNumber numberWithFloat:0.0 * M_PI], 
    [NSNumber numberWithFloat:0.5 * M_PI], 
    [NSNumber numberWithFloat:1.0 * M_PI], nil]; 

animation.keyTimes = [NSArray arrayWithObjects: 
    [NSNumber numberWithFloat:0.0], 
    [NSNumber numberWithFloat:0.5], 
    [NSNumber numberWithFloat:1.0], nil]; 

animation.timingFunctions = [NSArray arrayWithObjects: 
    [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionLinear], 
    [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionLinear], nil]; 

[layer addAnimation:animation forKey:@"transform.rotation.z"]; 

Si desea animación a la izquierda, debe usar valores negativos. Para una animación un poco más básica, puede usar CABasicAnimation:

CALayer* layer = someView.layer; 
CABasicAnimation* animation; 
animation = [CABasicAnimation animationWithKeyPath:@"transform.rotation.z"]; 

animation.fromValue = [NSNumber numberWithFloat:0.0 * M_PI]; 
animation.toValue = [NSNumber numberWithFloat:1.0 * M_PI]; 

animation.duration = 1.0; 
animation.cumulative = YES; 
animation.repeatCount = 1; 
animation.removedOnCompletion = NO; 
animation.fillMode = kCAFillModeForwards; 

[layer addAnimation:rotationAnimation forKey:@"transform.rotation.z"]; 
+0

¿Debo incluir algo especial? Xcode se queja de todas las cosas de kCA como kCAMediaTimingFunctionLinear. Ellos son desconocidos. – Thanks

+0

".objc_class_name_CAKeyframeAnimation", hace referencia a partir de: literal triple @__ ObjC @__ cls_refs @ CAKeyframeAnimation en TestClass.o ld: Símbolo (s) que no se encuentra collect2: ld devolvió el código de salida 1 – Thanks

+2

Cada vez que tenga un problema con algo que no parece encontrado, debe buscarlo en la documentación para ver dónde está definido. En este caso, esas constantes se definen en CAMediaTiming y CAMediaTimingFunction que forman parte del marco QuartzCore. Si no ha agregado QuartzCore.framework, ese es probablemente su problema. –

1

Creo que tienes que darle otro "marco clave" si quieres darle a Core Animation la pista de que necesita ir en esa dirección.

Asegúrese y desactive la aceleración, (al menos para el final/comienzo del paso intermedio) de lo contrario, la animación no se verá suave.

Cuestiones relacionadas