当我想要顺时针方向时,为什么我的旋转只会逆时针方向?

gem*_*der 12 core-animation objective-c ios

[CATransaction begin];
            [CATransaction setAnimationDuration:5];
            CGAffineTransform currentTransform = squareLayer.affineTransform;
            CGFloat angle = M_PI;

            squareLayer.affineTransform = CGAffineTransformRotate(currentTransform, angle);
            [CATransaction commit];
Run Code Online (Sandbox Code Playgroud)

[CATransaction begin];
            [CATransaction setAnimationDuration:5];
            CGAffineTransform currentTransform = squareLayer.affineTransform;
            CGFloat angle = (M_PI * -1);

            squareLayer.affineTransform = CGAffineTransformRotate(currentTransform, angle);
            [CATransaction commit];
Run Code Online (Sandbox Code Playgroud)

我原本以为-1会扭转方向,但显然不是?

Rad*_*aid 15

角度是一样的.要完整的圆圈你需要2*Pi,所以半圈是Pi.如果你拿-Pi它会在同一点结束.

编辑:如果你需要顺时针转动,你可以略微离开-Pi.而不是-M_PI使用-3.141593例如.


XJo*_*nes 9

刚碰到这个,虽然@ 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);
                 }];
Run Code Online (Sandbox Code Playgroud)


Dun*_*n C 5

我对Core animatinon的经验与Apple引用不一致.我发现,唯一重要的是最终的角度值.正pi和负pi旋转导致相同的变换矩阵,因此系统无论如何都只是逆时针.

我在特定方向上旋转或完整旋转360度所做的是使用类似transform.rotation.z创建显式CABasicAnimation,填充模式设置为kCAFillModeForwards,并且仅提供toValue .这会导致动画从之前的值开始.然后,您可以设置一个旋转,该旋转是您所需旋转总量的偶数部分,并给它重复计数.

例如,下面的代码创建一个旋转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];
Run Code Online (Sandbox Code Playgroud)