使用CGAffineTransform的奇怪结果

时间:2012-04-19 06:17:52

标签: objective-c ios cocoa-touch uiviewanimation cgaffinetransform

我正在尝试使用多个CGAffineTransformsCGAffineTransformConcats将动画串联起来。我试图实现的总体目标是让我的图像旋转45度,同时向上移动50像素,然后再向下旋转45度。

 CGAffineTransform translateUp = CGAffineTransformMakeTranslation(0, -50);
    CGAffineTransform firstSpin = CGAffineTransformMakeRotation(M_PI_4);
    CGAffineTransform translateDown = CGAffineTransformMakeTranslation(0, 50);
    CGAffineTransform secondSpin = CGAffineTransformMakeRotation(M_PI_4);
    CGAffineTransform transform1 =  CGAffineTransformConcat(translateUp, firstSpin);
    CGAffineTransform transform2 =  CGAffineTransformConcat(translateDown, secondSpin);
    CGAffineTransform transformFull =  CGAffineTransformConcat(transform1, transform2);    
    [UIView beginAnimations:@"MoveAndRotate" context:nil];
    [UIView setAnimationCurve:UIViewAnimationCurveEaseInOut]; 
    [UIView setAnimationDuration:0.5];
    mainCharacterImage.transform = transformFull;
    [UIView commitAnimations];

现在请注意,我对CG相关的所有内容都很陌生,但我不明白为什么这不起作用。

然而,我不认为这不是一个事实,这不是一个奇怪的部分,我的问题主要是,任何人都可以解释为什么上面的代码导致我的图像不仅向上移动和旋转,但要向右移动约100个像素?

非常感谢任何建议!

1 个答案:

答案 0 :(得分:5)

因为transformFull是((translateUp * firstSpin)*(translateDown * secondSpin))的矩阵乘法的结果。你的动画直接从起点开始计算这个矩阵乘法的结果,恰好是:

0, 1, 0
-1, 0, 0
50 - 25 * sqrt(2), 25 * sqrt(2), 1

此变换矩阵恰好将项目向右移动约100个像素。

转换矩阵没有历史记录。它无法分辨哪些步骤使其达到该值并完成这些步骤。相反,你必须刻意转向每一步。尝试分两个阶段完成这个动画。将mainCharacterImage移至transform1。然后移动到一个只是π/ 2旋转的新变换。