使用CGAffineTransform的奇怪结果

Mic*_*lum 1 cocoa-touch objective-c cgaffinetransform uiviewanimation ios

我试图使用几个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];
Run Code Online (Sandbox Code Playgroud)

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

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

任何建议都非常感谢!

Mr.*_*rna 5

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

0, 1, 0
-1, 0, 0
50 - 25 * sqrt(2), 25 * sqrt(2), 1
Run Code Online (Sandbox Code Playgroud)

这个转换矩阵恰好将项目向右移动大约100个像素.

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