CATransaction旋转层360度奇怪

时间:2014-02-13 17:24:32

标签: ios core-animation

我想执行无限360度旋转动画,所以我编码:

- (void)rotate
{
    __weak typeof(self) weakSelf = self;

    [CATransaction begin];
    [CATransaction setDisableActions:NO];
    [CATransaction setCompletionBlock:^{
        [weakSelf rotate];
    }];
    [CATransaction setAnimationDuration:1.0];
    [CATransaction setAnimationTimingFunction:
     [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut]];
    self.squareLayer.transform = CATransform3DRotate(self.squareLayer.transform, M_PI, 0, 0, 1);
    [CATransaction commit];
}

M_PI表示180度,所以我相信图层可以从0旋转到M_PI * 1M_PI * 2 ......

但事实证明是从0M_PI,然后是M_PI0的轮换。

我可以通过CABasicAnimation

来完成
CABasicAnimation *animatin = [CABasicAnimation animationWithKeyPath:@"transform"];
animatin.duration = 1.0;
animatin.fromValue = [NSValue valueWithCATransform3D:CATransform3DMakeRotation(0, 0, 0, 1)];
animatin.toValue = [NSValue valueWithCATransform3D:CATransform3DMakeRotation(M_PI, 0, 0, 1)];
animatin.repeatCount = HUGE_VALF;
animatin.fillMode = kCAFillModeForwards;
[self.squareLayer addAnimation:animatin forKey:@"a"];

上面的代码将图层旋转360度。

但我对第一次实施感到困惑,为什么旋转这么奇怪?

1 个答案:

答案 0 :(得分:2)

这是一个边缘案例。使用隐式动画,您无法说“顺时针旋转此数量”。您只是在说“将变换设置为此值,并为该效果设置动画”。那么,这个改变应该如何动画?运行时必须构成一个答案,并且如何做到这一点并不明显。 M_PI的旋转变换在两个方向上都是相同的“距离”,因此它所构成的答案是任意的。如果您提供M_PI+0.1的值与值M_PI-0.1的值,则可以更清楚地看到问题。你实际得到反向结果:一个顺时针转动,另一个逆时针转动。

另一方面,对于CABasicAnimation,您有一个从值(隐式或显式)和一个到值,因此您可以表达“增加”的概念(即正差意味着顺时针转动)。如果通过仅设置byValue来动画,则更加清晰。