web-dev-qa-db-fra.com

Faire pivoter un CALayer à 90 degrés?

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.

27
Kristina Brooks

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.

13
Rab

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.

44
Jonathan Grynspan

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).

8
SteamTrout

Pour faire pivoter 90 'à droite:

myView.transform = CGAffineTransformMakeRotation(M_PI_2);
3
Chris

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.)

1
Duncan C