1

CGPathAddEllipseInRect用来画一个圆圈,然后在 CAKeyframeAnimation 中使用它。我的问题是动画总是在同一个地方开始。我认为我可以使用 CGAffineTransform 执行以下操作,以使其从不同的点开始:

CGAffineTransform temp = CGAffineTransformMakeRotation(M_PI / 2);
CGPathAddEllipseInRect(animationPath , &temp, rect);

我不知道这是在做什么。当它运行时,我什至看不到动画的这一部分。它正在做一些屏幕外的事情。任何帮助理解这一点都会很棒。

4

1 回答 1

5

默认情况下,旋转围绕原点 (0,0) 进行,但您想围绕圆心旋转,因此您必须进行额外的转换:

float midX = CGRectGetMidX(rect);
float midY = CGRectGetMidY(rect);
CGAffineTransform t = 
    CGAffineTransformConcat(
        CGAffineTransformConcat(
            CGAffineTransformMakeTranslation(-midX, -midY), 
            CGAffineTransformMakeRotation(angle)), 
        CGAffineTransformMakeTranslation(midX, midY));
CGPathAddEllipseInRect(animationPath, &t, rect);

本质上,这链接了三个变换:首先,将圆移动到原点 (0,0),然后应用旋转,然后将其移回其原始位置。我做了一些可视化来说明效果:

我选择了正方形而不是圆形,选择了 45° 而不是 90°,以使旋转更容易看到,但原理是一样的。

于 2011-04-27T02:08:14.783 回答