2010-07-29 11 views
25

¿Cómo giro un CALayer 90 grados? Necesito rotar todo, incluidas las subcapas y el sistema de coordenadas.¿Girando un CALayer 90 grados?

+0

No olvide establecer el punto de anclaje de capa si es necesario. No se "volteará" de la misma manera si lo coloca en el medio en lugar de la parte superior de la capa – guillaume

Respuesta

12

Si estoy animándola utilizo algo como esto en mis aplicaciones:

- (NSObject *) defineZRotation { 
    // Define rotation on z axis 
    float degreesVariance = 90; 
    // object will always take shortest path, so that 
    // a rotation of less than 180 deg will move clockwise, and more than will move counterclockwise 
    float radiansToRotate = DegreesToRadians(degreesVariance); 
    CATransform3D zRotation; 
    zRotation = CATransform3DMakeRotation(radiansToRotate, 0, 0, 1.0); 
    // create an animation to hold "zRotation" transform 
    CABasicAnimation *animateZRotation; 
    animateZRotation = [CABasicAnimation animationWithKeyPath:@"transform"]; 
    // Assign "zRotation" to animation 
    animateZRotation.toValue = [NSValue valueWithCATransform3D:zRotation]; 
    // Duration, repeat count, etc 
    animateZRotation.duration = 1.5;//change this depending on your animation needs 
    // Here set cumulative, repeatCount, kCAFillMode, and others found in 
    // the CABasicAnimation Class Reference. 
    return animateZRotation; 
} 

Por supuesto se puede usar en cualquier lugar, don; t tiene que volverlo a partir de un método si eso no parece; t traje tus necesidades.

+1

El bit de animación es bastante prolijo. –

+1

Me alegro de que ayude. Suerte con ello. – Rab

+0

No es necesario crear un objeto CAAnimation para rotar una vista. Para eso, animateWithDuration: animaciones funciona bien. Ver mi respuesta para más detalles. –

8

Básicamente algo así:

CGAffineTransform rotateTransform = CGAffineTransformMakeRotation(M_PI/2.0); [myCALayer setAffineTransform:rotateTransform];

EDIT: Se va a girar en sentido horario o antihorario dependiendo de la plataforma (iOS o Mac OS).

+3

Radianes, no grados. 90.0/180.0 * M_PI, o M_PI/2.0. –

+0

Oh, sí, lo siento, no me di cuenta. – SteamTrout

42

Obj-C:

theLayer.transform = CATransform3DMakeRotation(90.0/180.0 * M_PI, 0.0, 0.0, 1.0); 

Swift:

theLayer.transform = CATransform3DMakeRotation(90.0/180.0 * .pi, 0.0, 0.0, 1.0) 

Es decir, transformar la capa de tal manera que se gira 90 grados (pi/2 radianes), con 100% de esa rotación que tiene lugar alrededor del eje z.

+1

M_PI es doble y CATransform3DMakeRotation requiere que el ángulo sea CGFloat, por lo que se debe usar CGFloat (M_PI) en su lugar –

+0

En C, la conversión de doble a CGFloat es implícita (y los moldes en C y Objective-C toman la forma * (T) expresión *, no * T (expresión) *. ¿Estás pensando en Swift o C++?) Moreso, 'M_PI' se multiplica por un' doble' en la instrucción anterior, por lo que se ensancha, derrotando el propósito del elenco. –

+0

Correcto, estaba pensando en Swift, teniendo dificultad para rotar un arco en una trayectoria circular. –

3

Para girar 90' derecha:

myView.transform = CGAffineTransformMakeRotation(M_PI_2); 
+0

esto funciona para vistas, no para capas. – anneblue

+0

¡Gracias! Está funcionando bien. – Raja

1

Rab mostró cómo no hacerlo con un objeto CAAnimation. En realidad es más simple que eso:

[myView animateWithDuration: 0.25 
    animations: 
    ^{ 
    myView.transform = CGAffineTransformMakeRotation(M_PI/2); 
    } 
]; 

(el levantamiento de la línea de transformar de de respuesta Chris - demasiado perezoso para volver a escribir, puesto que ya proporciona el código perfecto.)

código de Chris sería girar la vista sin animación Mi código anterior hará lo mismo con la animación.

De forma predeterminada, las animaciones son fáciles de usar, facilitan el tiempo. Puede cambiar eso con una versión un poco más compleja de la llamada animateWithDuration (Use animateWithDuration:delay:options:animations:completion: y pase en el tiempo deseado en el parámetro options.)

+0

animateWithDuration: animaciones: es un método basado en bloques para UIView. La pregunta aquí es cómo animar a CALayer: CALayer no tiene este método, o al menos no está documentado que lo tenga. También en 2010, el método animateWithDuration: animations: no existía aún (ni, creo, hizo nada basado en bloques en Obj-C) ... así que esto sería más una "actualización para 2012" si se aplicara. – Rab

+0

también se animará el código de Chris. con la duración estándar de las animaciones CALayer. – vikingosegundo

Cuestiones relacionadas