2009-02-12 51 views
28

我正在写一个iPhone应用程序,并且我有一张我想要向外旋转的图像。我可以使用CGAffineTransformMakeRotation旋转视角超过360度吗?

目前我的代码看起来像这样(包裹在beginAnimations/commitAnimations块):

scale = CGAffineTransformScale(CGAffineTransformIdentity, 5.0f, 5.0f); 
swirl = CGAffineTransformRotate(scale, M_PI); 
[player setTransform:swirl];  
[player setAlpha:0.0f]; 

但我发现,如果我试图改变旋转的,比如说角度,4 * M_PI,它根本不旋转。是否可以使用CGAffineTransformRotate获得720˚的旋转,还是必须切换到其他技术?

如果我不得不切换到另一种技术,你会推荐使用另一个线程(或计时器)来自己做动画,还是OpenGL会是更好的路线?

谢谢,
布莱克。

回答

64

无论旋转角度小于一个完整旋转角度还是旋转角度的许多倍数,您都可以将视图旋转一定数量的弧度,而无需将旋转分割为多个部分。作为一个例子,下面的代码会在一个指定的秒数内旋转一个视图,每秒一次。您可以轻松修改它以旋转一定数量的旋转视图,或旋转一定数量的弧度。

- (void) runSpinAnimationWithDuration:(CGFloat) duration; 
{ 
    CABasicAnimation* rotationAnimation; 
    rotationAnimation = [CABasicAnimation animationWithKeyPath:@"transform.rotation.z"]; 
    rotationAnimation.toValue = [NSNumber numberWithFloat: M_PI * 2.0 /* full rotation*/ * rotations * duration ]; 
    rotationAnimation.duration = duration; 
    rotationAnimation.cumulative = YES; 
    rotationAnimation.repeatCount = 1.0; 
    rotationAnimation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseOut]; 

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

你可以,但你需要将你的动画分成半圆旋转。我提供了一个例子来回应this question,使用重复的CABasicAnimation应用于视图下的图层。正如我在那里所建议的那样,将这些半旋转作为CAKeyframeAnimation的组成部分可能是更好的方式来构造它,因为动画会更平滑(在我的示例中,在半旋转之间有轻微的障碍),并且您可以在开始和结束时有一个很好的加速/减速。

+0

很酷。这似乎正在做我所希望的,而且我想我也可以为它添加缩放转换,并自行获取通知给我的课程。 谢谢! – bwinton 2009-02-12 21:02:10

+2

说你必须将动画分成半圈旋转是不正确的。看到我的答案。 – mahboudz 2009-09-14 19:29:37

+0

如果您依赖CATransform3D作为您正在动画的值,那么确实如此。我没有想过你的方法,使用核心动画为变换结构字段提供的关键路径扩展。你是对的,这可能是一个更清晰的方法来解决这个问题。 – 2009-09-14 21:36:21

5

对标题的回答:是的,CGAffineTransform可以旋转360度以上。
对问题的回答:是的,但无法为其设置动画,因为没有任何动画。

请记住the affine transformation is a matrix,并且旋转矩阵包含预计算的的正弦和余弦值。这是因为如果你说:

CGFloat angle = 4.0 * M_PI; 
NSAffineTransformStruct matrix = { 
    .m11 = cos(angle), 
    .m12 = sin(angle), 
    .m21 = -sin(angle), 
    .m22 = cos(angle), 
    .tx = 0.0, 
    .ty = 0.0 
}; 
NSAffineTransform *transform = [NSAffineTransform transform]; 
[transform setTransformStruct:matrix]; 

现在,让我们来回顾一些样本值cossin

  • cos(0π) = 1
  • sin(0π) = 0
  • cos(2π) = 1
  • sin(2π) = 0
  • cos(4π) = 1
  • sin(4π) = 0

记住,基质不包含角 - 它仅包含余弦和正弦。而且这些值不会从一个圆圈变成另一个圆圈。因此,没有任何动画。

(请注意,Calculator.app给出了COS(xπ)和sin(xπ)错误的结果。尝试绘图器,calc,或Google。)

您需要将动画分割成一个圆圈分数。 Brad Larson建议的半圈将会很好。