iphone - CGAffineTransform 旋转方向错误

标签 iphone rotation cgaffinetransform

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

YourView.transform = CGAffineTransformMakeRotation( positive value ); 

将顺时针旋转 View ,并且

YourView.transform = CGAffineTransformMakeRotation( Negative value ); 

逆时针旋转 View ,

但是文档说:

仿射变换旋转的角度(以弧度为单位)。在 iOS 中,正值指定逆时针旋转,负值指定顺时针旋转。

这些互相矛盾吗?

最佳答案

您的困惑是可以理解的。

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

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

normal coordinate system

因此,如果您创建自己的 CGContext(例如,通过使用 CGBitmapContextCreateCGPDFContextCreate),旋转将按您的预期进行。

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

flipped coordinate system

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

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

UIView 还使用翻转坐标系来布局其 subview ,这会影响 UIView transform 属性的含义。

关于iphone - CGAffineTransform 旋转方向错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11732128/

相关文章:

iphone - 使用麦克风作为MTAudioProcessingTap的输入

iphone - tableheaderview 滚动事件

iphone - 获取国家域名代码

animation - 隐藏的溢出在 CSS 旋转动画期间不起作用

android - 在 GridView 中旋转图像

ios - 从两个 UIView 中的每一个中的三个点计算 CGAffineTransform 的值?

iphone - 全景热点实现

javascript - jQuery Slidetoggle + 旋转

ios - CGAffineTransform.identity 在设备旋转后无法正确重置变换

iphone - 旋转父 View 后计算 CGAffineTransform 矩阵