Почему My Rotation работает только против часовой стрелки, когда я хочу идти по часовой стрелке?
[CATransaction begin];
[CATransaction setAnimationDuration:5];
CGAffineTransform currentTransform = squareLayer.affineTransform;
CGFloat angle = M_PI;
squareLayer.affineTransform = CGAffineTransformRotate(currentTransform, angle);
[CATransaction commit];
и
[CATransaction begin];
[CATransaction setAnimationDuration:5];
CGAffineTransform currentTransform = squareLayer.affineTransform;
CGFloat angle = (M_PI * -1);
squareLayer.affineTransform = CGAffineTransformRotate(currentTransform, angle);
[CATransaction commit];
Я бы подумал, что -1 изменит направление, но, по-видимому, не?
Ответы
Ответ 1
Угол тот же. Чтобы пройти полный круг, вам нужно 2 * Pi, поэтому половина круга - это Pi. Если вы возьмете -Pi, он закончится в той же точке.
РЕДАКТИРОВАТЬ: Если вам нужно повернуть его по часовой стрелке, вы можете слегка отклониться от -Pi. Вместо -M_PI использовать, например, -3.141593.
Ответ 2
Просто наткнулся на это, и в то время как решение @radicalraid работает нормально, я предпочитаю регулировать начальный угол перед вращением против вращения до угла, меньшего желаемой конечной точки. Кроме того, вы можете анимировать преобразования CALayer
с использованием блоков анимации.
Мой код:
// iOS will rotate the shortest distance to the end angle,
// using counter-clockwise if equal.
// Force the rotation to open clockwise and close counter-clockwise by bumping
// the initial angle
CGFloat startRadians, endRadians;
if (isOpening) {
startRadians = 0.01f;
endRadians = M_PI;
}
else {
startRadians = M_PI - 0.01f;
endRadians = 0.0f;
}
self.myImageView.layer.affineTransform = CGAffineTransformMakeRotation(startRadians);
[UIView animateWithDuration:0.3f
animations:^{
self.myImageView.layer.affineTransform = CGAffineTransformMakeRotation(endRadians);
}];
Ответ 3
Мой опыт работы с Core animatinon не согласуется с этой цитатой Apple. Я обнаружил, что единственное, что имеет значение, - это значение конечного угла. Положительные pi и отрицательные pi вращения приводят к одной и той же матрице преобразования, поэтому система просто идет против часовой стрелки независимо.
То, что я сделал для поворота в определенном направлении или вращения на 360 градусов, заключается в создании явного CABasicAnimation с использованием типа transform.rotation.z, с режимом заполнения, заданным kCAFillModeForwards, и только предоставить значение. Это заставляет анимацию начинать с предыдущего значения. Затем вы можете установить поворот, который является ровной долей вашего общего желаемого вращения, и дать ему счетчик повторов.
Например, приведенный ниже код создает анимацию, которая вращает 5 четвертей оборотов или 450 градусов. Если вы хотите сделать 180 градусов по часовой стрелке, вы можете вращать pi/2 с повторным числом 2. Для против часовой стрелки используйте -pi/2 с повторным числом 2.
CABasicAnimation* rotate = [CABasicAnimation animationWithKeyPath:
@"transform.rotation.z"];
rotate.removedOnCompletion = FALSE;
rotate.fillMode = kCAFillModeForwards;
//Do a series of 5 quarter turns for a total of a 1.25 turns
//(2PI is a full turn, so pi/2 is a quarter turn)
[rotate setToValue: [NSNumber numberWithFloat: -M_PI / 2]];
rotate.repeatCount = 5;
rotate.duration = duration/rotate.repeatCount * 2 ;
rotate.beginTime = start;
rotate.cumulative = TRUE;
rotate.timingFunction = [CAMediaTimingFunction
functionWithName:kCAMediaTimingFunctionLinear];
Ответ 4
Взгляните на этот предыдущий вопрос: Вращение по часовой стрелке/против часовой стрелки для CABasicAnimation для UIImageView код немного отличается, но он работает.
Ответ 5
Вот цитата из документации на яблоко "В iOS положительное значение указывает вращение против часовой стрелки, а отрицательное значение указывает вращение по часовой стрелке". Вы пробовали это сделать:
squareLayer.affineTransform = CGAffineTransformRotate(currentTransform, -M_PI);
То, что я использовал, чтобы сделать все мое вращение по часовой стрелке в прошлом.
Ответ 6
EDIT: вместо -M_PI используйте -3 * M_PI, для против часовой стрелки
и удалите знак "-" для противоположного направления.
Ответ 7
Согласитесь с Дунканом и XJones. Конечная ценность - это все, что кажется важным. Затем CA найдет кратчайший путь.
Использование идеи XJones. Мне это показалось:
private let angleRadians = CGFloat(M_PI)
private let angleRadiansOffset = CGFloat(0.1 * M_PI/180.0)
let turnAngle = angleRadians - angleRadiansOffset;
//pre-rotate by an 'invisible amount', to force rotation in the same direction every time
primView.layer.transform = CATransform3DRotate(primView.layer.transform, angleRadiansOffset, 0.0, 1.0, 0.0)
UIView.animateKeyframesWithDuration(duration, delay: 0, options: [.BeginFromCurrentState], animations: { () -> Void in
UIView.addKeyframeWithRelativeStartTime(0, relativeDuration: 0.8, animations: { () -> Void in
//now we will complete the rotation to the correct end value
primView.layer.transform = CATransform3DRotate(primView.layer.transform, turnAngle, 0.0, 1.0, 0.0)
})
//... other code ....
}) { (finished) -> Void in
}