Поворот CALayer на 90 градусов? - PullRequest
28 голосов
/ 29 июля 2010

Как мне повернуть CALayer 90 градусов? Мне нужно повернуть все, включая подслои и систему координат.

Ответы [ 5 ]

49 голосов
/ 29 июля 2010

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)

То есть преобразовать слой так, чтобы он вращался на 90 градусов (π / 2 радиана), с 100% этого вращения происходит вокруг оси Z.

13 голосов
/ 29 июля 2010

Если я анимирую это, я использую что-то подобное в своих приложениях:

- (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;
}

Конечно, вы можете использовать это где угодно, не нужно возвращать это из метода, если это не так;удовлетворить ваши потребности.

8 голосов
/ 29 июля 2010

В основном что-то в этом роде:

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

РЕДАКТИРОВАТЬ: он будет вращаться по часовой стрелке или против часовой стрелки в зависимости от платформы (iOS или Mac OS).

3 голосов
/ 13 ноября 2011

Для поворота на 90 'вправо:

myView.transform = CGAffineTransformMakeRotation(M_PI_2);
0 голосов
/ 17 мая 2012

Раб показал, как это сделать с CAAnimation объектом. Это на самом деле проще, чем это:

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

(поднимая строку преобразования из Ответ Криса - слишком ленив, чтобы переписать его, поскольку он уже предоставил идеальный код.)

Код Криса будет вращать вид без анимации. Мой код выше будет делать то же самое с анимацией.

По умолчанию в анимациях используется упрощение, ускорение синхронизации. Вы можете изменить это с помощью более сложной версии вызова animateWithDuration (используйте вместо этого animateWithDuration:delay:options:animations:completion: и передайте желаемое время в параметре options.)

...