首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >CATransaction旋转层360度奇怪

CATransaction旋转层360度奇怪
EN

Stack Overflow用户
提问于 2014-02-13 17:24:32
回答 1查看 759关注 0票数 0

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

代码语言:javascript
复制
- (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

代码语言:javascript
复制
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度完美。

但是我真的很困惑第一个实现,为什么它旋转这么奇怪?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-02-14 06:43:40

这是个边缘案件。有了隐含的动画,你就不能说“顺时针旋转这个量”。您只是说“将转换设置为此值,并将此效果动画化”。那么,这种变化应该如何动画化呢?运行时必须给出一个答案,而如何做到这一点并不明显。M_PI的旋转变换在两个方向上都是相同的“距离”,所以它构成的答案是任意的。如果您提供一个M_PI+0.1值与M_PI-0.1值,您可以更清楚地看到问题所在;实际上,您可以得到相反的结果:一个一直顺时针方向旋转,另一个逆时针方向旋转。

另一方面,对于CABasicAnimation,您有一个from-value (隐式或显式)和一个to-value,所以您能够表达“增加”这个概念(即正差意味着顺时针方向旋转)。如果你只是通过设置byValue来动画的话,那就更清楚了。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21761184

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档