1

我正在尝试使用几个CGAffineTransformsCGAffineTransformConcats. 我试图实现的总体目标是让我的图像在向上移动 50 像素的同时旋转 45 度,然后在向下移动时再旋转 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 像素?

任何建议都非常感谢!

4

1 回答 1

5

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

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

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

变换矩阵没有历史。它无法判断是哪些步骤使其达到该值并通过这些步骤。相反,你必须有意识地移动到每一步。尝试分两个阶段制作此动画。移动mainCharacterImagetransform1。然后移动到一个新的变换,它只是一个 π/2 的旋转。

于 2012-04-19T14:13:20.127 回答