2011-04-26 51 views
1

我使用CGPathAddEllipseInRect绘制一个圆,然后在CAKeyframeAnimation中使用该圆。我的问题是动画总是在同一个地方开始。我认为我可以做到以下几点与CGAffineTransform,使其在不同的角度入手:CGPathAddEllipseInRect中的transform属性

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

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

回答

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); 

从本质上讲,这个链条3转换:首先,将圆移至原点(0,0),然后应用旋转,然后将其移回其原始位置。我做了一个小的可视化来说明效果:

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

+0

很好的答案 - 但你能否解释一点。当你说起源时,我会认为它是传递CGPathAddEllipseInRect的矩形的起源。但是,如果是这样的话,那么我仍然应该在屏幕上看到它,而这并没有发生。如果它是屏幕的原点,那么我假设我会看到它在屏幕的底部角落做四分之一的旋转,这也没有发生。当我在其中一个电话上登录电话会议时,我得到了这个 - {{633.066,600.916},{40,40}}。这些图层被随机放置,这就是为什么这些坐标看起来很有趣。 – Brian 2011-04-27 09:59:22

+0

另外,您能否解释翻译在代码中的作用? – Brian 2011-04-27 10:07:41

+0

我已经为我的答案添加了一些额外的解释和可视化。希望这可以帮助。 – omz 2011-04-27 13:31:59