【问题标题】:CGAffineTransform rotation goes the wrong wayCGAffineTransform 旋转走错路了
【发布时间】:2012-07-31 02:01:11
【问题描述】:

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

YourView.transform = CGAffineTransformMakeRotation( positive value ); 

将顺时针旋转视图,并且

YourView.transform = CGAffineTransformMakeRotation( Negative value ); 

将逆时针旋转视图,

但是文件说:

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

这些是否相互矛盾?

【问题讨论】:

  • 我刚刚测试了它,我得到了相同的结果。文档确实指定在 OSX 中它具有这种行为。但不像你说的那样在ios中,很奇怪。
  • 你的value恰好是π/2吗?
  • @ibeitia: 是的,我试过 π/2 和 -π/2

标签: iphone rotation cgaffinetransform


【解决方案1】:

你的困惑是可以理解的。

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

“原生”Core Graphics 坐标系仿照标准Cartesian coordinate system,其中 Y 轴在页面上向上增加。在本系统中,正角代表逆时针旋转:

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

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

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

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

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

【讨论】:

  • 但在这样的翻转坐标系中,正角度表示顺时针旋转,但文档说“在 iOS 中,正值表示逆时针旋转。”所以我觉得还是矛盾的。文件有误吗?
  • 有时会出错。这取决于您使用转换的上下文。
  • @romox 您可能正在阅读类似this 的内容。那是 CoreGraphics 文档,但您在 UIKit 坐标系中,而不是在 Core Graphics 坐标系中,所以一切看起来都是正确的。在SO post 中阅读更多内容。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-27
  • 1970-01-01
  • 1970-01-01
  • 2023-01-21
  • 2012-11-27
  • 1970-01-01
相关资源
最近更新 更多