1

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

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个像素?

任何建议非常感谢!

回答

5

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

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

这个变换矩阵刚好移动大约100个像素的权利的项目。

转换矩阵没有历史记录。它无法分辨哪些步骤能够达到这个价值并通过这些步骤。相反,你必须刻意转移到每一步。试着分两步做这个动画。将mainCharacterImage移动到transform1。然后移动到一个新的转换,它只是π/ 2的旋转。