我想要执行一个无限的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 * 1,M_PI * 2 .
但结果是从0到M_PI,然后是M_PI到0的轮转。
我可以通过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度完美。
但是我真的很困惑第一个实现,为什么它旋转这么奇怪?
发布于 2014-02-14 06:43:40
这是个边缘案件。有了隐含的动画,你就不能说“顺时针旋转这个量”。您只是说“将转换设置为此值,并将此效果动画化”。那么,这种变化应该如何动画化呢?运行时必须给出一个答案,而如何做到这一点并不明显。M_PI的旋转变换在两个方向上都是相同的“距离”,所以它构成的答案是任意的。如果您提供一个M_PI+0.1值与M_PI-0.1值,您可以更清楚地看到问题所在;实际上,您可以得到相反的结果:一个一直顺时针方向旋转,另一个逆时针方向旋转。
另一方面,对于CABasicAnimation,您有一个from-value (隐式或显式)和一个to-value,所以您能够表达“增加”这个概念(即正差意味着顺时针方向旋转)。如果你只是通过设置byValue来动画的话,那就更清楚了。
https://stackoverflow.com/questions/21761184
复制相似问题