CGPathAddEllipseInRect中的transform属性

Bri*_*ian 1 cocoa core-animation quartz-graphics cgpath

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

CGAffineTransform temp = CGAffineTransformMakeRotation(M_PI / 2);
CGPathAddEllipseInRect(animationPath , &temp, rect);
Run Code Online (Sandbox Code Playgroud)

我不知道这是做什么的.当它运行时,我甚至看不到动画的这一部分.它正在做一些屏幕外的事情.任何帮助理解这将是伟大的.

omz*_*omz 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);
Run Code Online (Sandbox Code Playgroud)

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

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