强制顺时针/逆时针旋转UIImageView的CABasicAnimation

时间:2010-08-12 16:54:31

标签: iphone objective-c core-animation core-graphics rotation

我正在制作一个钟摆,它从0度摆动到最大200度,然后再回来。问题是,如果钟摆超过180度,它将通过最短路径返回到0,顺时针方向继续。而且我希望它逆时针走。这是我的代码: ('right'是一个布尔值,当钟摆从左向右摆动时为TRUE)

 - (void)swingPendulum {
    CABasicAnimation *rotationAnimation;
    rotationAnimation = [CABasicAnimation animationWithKeyPath:@"transform.rotation.z"];
    if (right) 
        rotationAnimation.toValue = [NSNumber numberWithFloat:degreesToRadians(kMax)];
    else
        rotationAnimation.toValue = [NSNumber numberWithFloat:degreesToRadians(kMin)];                               
    rotationAnimation.duration = 1.0;
    rotationAnimation.repeatCount = 1.0; 
    rotationAnimation.delegate = self;
    rotationAnimation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseIn];
    rotationAnimation.removedOnCompletion = NO;

    [pendulum.layer addAnimation:rotationAnimation forKey:@"rotationAnimation"];
}

任何想法如何让我的工作?这是我的摇摆仪拼图的最后一块,否则效果很好:D谢谢!

迈克尔

4 个答案:

答案 0 :(得分:8)

要让它逆时针走,只需将x设置为负值(添加 - 在前面) 你想要的地方

rotationAnimation.toValue = [NSNumber numberWithFloat:degreesToRadians(x)];

答案 1 :(得分:2)

尝试设置类似

的内容
rotationAnimation.valueFunction = [CAValueFunction functionWithName:kCAValueFunctionRotateZ];
  

使用值变换函数,动画可以使用每个组件的任意变换(不归一化到360°)来影响图层的变换属性,并且在一次应用多个动画时正常连接。

     

使用值转换函数,通过创建指定kCAValueFunctionRotateZ的CAValueTransform函数,然后创建一个fromValue为0,值为M_PI的动画,并设置动画的动画,绕z轴旋转0°到180° value将属性转换为值转换实例。

答案 2 :(得分:1)

我认为你必须使用这段代码:

[rotationAnimation.byValue = [NSNumber numberWithFloat:degreesToRadians(kMax/2))];
[rotationAnimation.toValue = [NSNumber numberWithFloat:degreesToRadians(kMin)];

答案 3 :(得分:0)

我不确定问题是什么,但是如果你使用动画的自动反转功能,你可以简化这个并使它来回旋转(摆动)。这对我有用:

CABasicAnimation* rotationAnimation = 
          [CABasicAnimation animationWithKeyPath:@"transform.rotation.z"];
[rotationAnimation setToValue:[NSNumber numberWithFloat:DegreesToRadians(200.0)]];
[rotationAnimation setDuration:1.0];
[rotationAnimation setRepeatCount:HUGE_VALF]; // Repeat forever
[rotationAnimation setAutoreverses:YES]; // Return to starting point

[[pendulum layer] addAnimation:rotationAnimation forKey:nil];