Как повернуть CALayer 90 градусов? Мне нужно повернуть все, включая подслои и систему координат.Вращение CALayer на 90 градусов?
ответ
Если я оживляющий его я использую что-то вроде этого в моих программах:
- (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;
}
Конечно, вы можете использовать его в любом месте, дон; т придется вернуть его из метода, если Безразлично, т костюм твои нужды.
Анимационный бит довольно аккуратный. –
Рад, что это помогает. Удачи вам. – Rab
Не нужно создавать объект CAAnimation для поворота представления. Для этого анимация анимации: анимация работает отлично. См. Мой ответ для более подробной информации. –
В основном что-то вроде этого:
CGAffineTransform rotateTransform = CGAffineTransformMakeRotation(M_PI/2.0); [myCALayer setAffineTransform:rotateTransform];
EDIT: Это будет вращаться по часовой стрелке или против часовой стрелки, в зависимости от платформы (IOS или Mac OS).
Радианы, а не градусы. 90.0/180.0 * M_PI или M_PI/2.0. –
О, ну, извините, не заметил. – SteamTrout
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.
M_PI - это Double и CATransform3DMakeRotation требует, чтобы угол был CGFloat, поэтому вместо CGFloat (M_PI) следует использовать –
В C, преобразование из double в CGFloat неявно (и отливки в C и Objective-C принимают форму * (T) expression *, not * T (выражение) *. Вы думаете о Swift или C++?) Moreso, 'M_PI' умножается на' double' в вышесказанном выше, поэтому он расширен, что лишает цель трансляции. –
Правильно, я думал о Свифт, с трудом поворачивая дугу по круговой траектории. –
Rab показал как это сделать с CAAnimation
объекта. Ее на самом деле проще, чем:
[myView animateWithDuration: 0.25
animations:
^{
myView.transform = CGAffineTransformMakeRotation(M_PI/2);
}
];
(снятие преобразования строки из Криса ответ - слишком ленив, чтобы переписать его, так как он уже предоставил совершенный код.)
код Криса будет вращать вид без анимации. Мой код выше будет делать то же самое с анимацией.
По умолчанию анимация использует легкость, облегчает синхронизацию. Вы можете изменить это со слегка более сложной версией вызова animateWithDuration
(вместо этого используйте animateWithDuration:delay:options:animations:completion:
и передайте нужное время в параметре параметров.)
animateWithDuration: анимация: это блок-метод для UIView. Вопрос здесь в том, как оживить CALayer - CALayer не имеет этого метода или, по крайней мере, он не документирован как имеющий его. Также в 2010 году метод animateWithDuration: анимации: еще не существовал (и, я думаю, ничего не сделал на блоке в Obj-C) ... так что это было бы скорее «обновлением на 2012 год», если бы оно применимо. – Rab
также код криса будет анимировать. со стандартной продолжительностью анимаций CALayer. – vikingosegundo
Не забудьте установить опорную точку слоя, если это необходимо. Он не будет «переворачиваться» таким же образом, если вы разместите его на середине вместо верхней части вашего слоя. – guillaume