CGAffineTransform旋转方向错误

时间:2012-07-31 02:01:12

标签: iphone rotation cgaffinetransform

在我的实验中,我得出结论:

YourView.transform = CGAffineTransformMakeRotation( positive value ); 

将顺时针旋转视图,

YourView.transform = CGAffineTransformMakeRotation( Negative value ); 

将逆时针旋转视图,

但文件说:

以弧度表示旋转仿射变换的角度。在iOS中,正值指定逆时针旋转,负值指定顺时针旋转。

这些是否相互矛盾?

1 个答案:

答案 0 :(得分:23)

你的困惑是可以理解的。

实际上,正角度表示从正X轴向正Y轴的旋转。负角度表示从正X轴向负Y轴的旋转。

“原生”核心图形坐标系统是在标准Cartesian coordinate system之后建模的,其中Y轴在页面上增加向上。在该系统中,正角度表示逆时针旋转:

normal coordinate system

因此,如果您创建自己的CGContext(例如,使用CGBitmapContextCreateCGPDFContextCreate),轮换将按预期工作。

然而,计算机系统历来使用坐标系,其中Y轴在页面上增加向下。在像这样的翻转坐标系中,正角表示顺时针旋转:

flipped coordinate system

请注意,在两个坐标系中,正角度从正X轴向正Y轴旋转。

事实证明,UIKit会翻转它为您创建的图形上下文的坐标系。这包括它在发送给您drawRect:之前设置的图形上下文以及它在UIGraphicsBeginImageContext中设置的图形上下文。 (Quartz 2D Programming Guide解释了这一点。)您可以通过查看当前变换矩阵(使用CGContextGetCTM)来检查这一点。你会发现它的-1元素中有d,这意味着Y轴被翻转。

UIView也使用翻转坐标系来布置其子视图,这会影响UIView transform属性的含义。