Comment faire pivoter un CALayer 90 degrés? Je dois tout faire pivoter, y compris les sous-couches et le système de coordonnées.
Si je l'anime, j'utilise quelque chose comme ceci dans mes applications:
- (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;
}
Bien sûr, vous pouvez l’utiliser n’importe où, vous n’avez pas à le renvoyer d’une méthode si cela ne vous convient pas.
Obj-C:
theLayer.transform = CATransform3DMakeRotation(90.0 / 180.0 * M_PI, 0.0, 0.0, 1.0);
Rapide:
theLayer.transform = CATransform3DMakeRotation(90.0 / 180.0 * .pi, 0.0, 0.0, 1.0)
En d’autres termes, transformez le calque de telle sorte qu’il soit pivoté de 90 degrés (π/2 radians), 100% de cette rotation ayant lieu autour de l’axe des z.
Fondamentalement, quelque chose comme ça:
CGAffineTransform rotateTransform = CGAffineTransformMakeRotation(M_PI / 2.0);
[myCALayer setAffineTransform:rotateTransform];
ÉDITER: La rotation s'effectue dans le sens des aiguilles d'une montre ou en sens inverse selon la plate-forme (iOS ou Mac OS).
Pour faire pivoter 90 'à droite:
myView.transform = CGAffineTransformMakeRotation(M_PI_2);
Rab a montré comment faire avec un objet CAAnimation
. C'est en fait plus simple que ça:
[myView animateWithDuration: 0.25
animations:
^{
myView.transform = CGAffineTransformMakeRotation(M_PI/2);
}
];
(soulève la ligne de transformation de la réponse de Chris - trop paresseuse pour la réécrire car il a déjà fourni le code parfait.)
Le code de Chris ferait pivoter la vue sans animation. Mon code ci-dessus fera la même chose avec l'animation.
Par défaut, les animations utilisent la facilité d'entrée, la synchronisation. Vous pouvez changer cela avec une version légèrement plus complexe de l'appel animateWithDuration
(Utilisez plutôt animateWithDuration:delay:options:animations:completion:
et transmettez le minutage souhaité dans le paramètre options.)