Почему 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];

Ответ 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

}