2010-07-29 2 views
25

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

+0

Не забудьте установить опорную точку слоя, если это необходимо. Он не будет «переворачиваться» таким же образом, если вы разместите его на середине вместо верхней части вашего слоя. – guillaume

ответ

12

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

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

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

+1

Анимационный бит довольно аккуратный. –

+1

Рад, что это помогает. Удачи вам. – Rab

+0

Не нужно создавать объект CAAnimation для поворота представления. Для этого анимация анимации: анимация работает отлично. См. Мой ответ для более подробной информации. –

8

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

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

EDIT: Это будет вращаться по часовой стрелке или против часовой стрелки, в зависимости от платформы (IOS или Mac OS).

+3

Радианы, а не градусы. 90.0/180.0 * M_PI или M_PI/2.0. –

+0

О, ну, извините, не заметил. – SteamTrout

42

Obj-C:

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

Свифта:

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

То есть, трансформировать слой таким образом, что она поворачивается на 90 градусов (П/2 радиан), со 100%, что поворот вокруг оси z.

+1

M_PI - это Double и CATransform3DMakeRotation требует, чтобы угол был CGFloat, поэтому вместо CGFloat (M_PI) следует использовать –

+0

В C, преобразование из double в CGFloat неявно (и отливки в C и Objective-C принимают форму * (T) expression *, not * T (выражение) *. Вы думаете о Swift или C++?) Moreso, 'M_PI' умножается на' double' в вышесказанном выше, поэтому он расширен, что лишает цель трансляции. –

+0

Правильно, я думал о Свифт, с трудом поворачивая дугу по круговой траектории. –

3

Чтобы повернуть 90' вправо:

myView.transform = CGAffineTransformMakeRotation(M_PI_2); 
+0

работает для просмотра не для слоев. – anneblue

+0

Спасибо! Он работает хорошо. – Raja

1

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

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

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

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

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

+0

animateWithDuration: анимация: это блок-метод для UIView. Вопрос здесь в том, как оживить CALayer - CALayer не имеет этого метода или, по крайней мере, он не документирован как имеющий его. Также в 2010 году метод animateWithDuration: анимации: еще не существовал (и, я думаю, ничего не сделал на блоке в Obj-C) ... так что это было бы скорее «обновлением на 2012 год», если бы оно применимо. – Rab

+0

также код криса будет анимировать. со стандартной продолжительностью анимаций CALayer. – vikingosegundo

 Смежные вопросы

  • Нет связанных вопросов^_^