【问题标题】:About CGAffineTransformMakeRotation rotation direction?关于 CGAffineTransformMakeRotation 旋转方向?
【发布时间】:2013-09-11 02:31:29
【问题描述】:

我正在尝试使用 CGAffineTransformMakeRotation,我参考了 Apple 文档,其中说

此矩阵旋转坐标系轴的角度(以弧度为单位)。 在 iOS 中,正值指定逆时针旋转,负值指定顺时针旋转。在 OS X 中,正值表示顺时针旋转,负值表示逆时针旋转。

所以,我传递参数90度,它应该逆时针旋转。
self.myView 为灰色背景色视图,红色方块视图仅用于查看旋转方向

#define DEGREES_TO_RADIANS(x) (x * M_PI/180.0)
CGAffineTransform rotation = CGAffineTransformMakeRotation( DEGREES_TO_RADIANS(90) );
[self.myView setTransform:rotation];


但是为什么是顺时针旋转呢?
我正在尝试在模拟器和设备中使用都具有相同的结果,顺时针旋转
然后尝试使用动画:

#define DEGREES_TO_RADIANS(x) (x * M_PI/180.0)
CGAffineTransform rotation = CGAffineTransformMakeRotation( DEGREES_TO_RADIANS(90) );
[UIView animateWithDuration:0.5
                 animations:^{
                     self.myView.transform = rotation;
                 }
                 completion:^(BOOL finished) {
                     NSLog(@"%@", NSStringFromCGAffineTransform(self.myView.transform));
                 }];

结果相同,顺时针旋转。

谁能解释一下,谢谢回复。

【问题讨论】:

标签: ios cgaffinetransform


【解决方案1】:

这是文档中的错误。

Here 他们描述了矩阵并提供了用于进行变换的方程:

如果您进行数学运算,您会发现 对于正角度,当 Y 轴方向向上时,它会产生 逆时针 旋转在 OS X 中顺时针,当 Y 轴像 在 iOS 中

那样向下

例如,您可以尝试将点 (5,0) 转换为 90 度,您将得到 (0,5),这意味着 iOS 为顺时针,OS X 为逆时针。

同样的文档仍然有你引用的(错误的)部分:

在 iOS 中,正值指定逆时针方向 旋转,负值指定顺时针旋转。在 OS X 中,一个 正值指定顺时针旋转,负值 指定逆时针旋转。

这显然是错误,因为方程式(它们是同一文档的一部分并且很漂亮standard rotation equations)正好相反。

【讨论】:

  • 我知道这是错误的。你必须记住你在 UIKit 的坐标系中,而不是标准的坐标系中。要达到标准,您需要翻转 x 轴。那时(你可以在脑海中想象它)它逆时针旋转。
【解决方案2】:

这实际上是正确的行为,并且文档正确地描述了它。

您在这里处理两个不同的坐标系。 Core Graphics 的坐标系在左下角有 (0, 0),但 UIKit 的坐标系在左上角有 (0, 0)。两个坐标系都有一个 X 轴,左侧为 0。换句话说,UIKit 的坐标系是垂直翻转的 Core Graphics 坐标系。下图展示了不同之处:


现在,让我们看看你的报价:

这个矩阵旋转坐标的角度,以弧度为单位 系统轴。在 iOS 中,正值指定逆时针方向 旋转,负值指定顺时针旋转。

乍一看这似乎是错误的,但你错过了一些东西。这是来自CGAffineTransformMakeRotation reference 的引用。这是 Core Graphics 参考的一部分,而不是 UIKit 参考。它指的是逆时针旋转Core Graphics 的坐标系

您可以通过垂直翻转您在屏幕上看到的内容并想象旋转的样子来想象这种旋转。

事实上,CGAffineTransformMakeRotation 引用有一个discussion item,它继续记录这一点:

实际旋转方向取决于坐标系 目标平台的方向,这在 iOS 和 macOS。


discussion item on CGContext's rotate(by:) method reference 更好地描述了这种行为:

上下文旋转的方向可能会被改变 执行此操作之前当前变换矩阵的状态 功能。例如,在 iOS 上,UIView 将转换应用于 反转 Y 轴的图形上下文(通过将其乘以 -1)。在先前翻转的坐标系上旋转用户坐标系会导致沿相反方向旋转 (也就是说,正值似乎使坐标系旋转 顺时针方向)。

【讨论】:

    【解决方案3】:

    要逆时针旋转.. 使你的角度在 -ve 例如:

    *

    imageToBeRotated.transform = CGAffineTransformMakeRotation(-angle); // for anti-clockwise rotation
    imageToBeRotated.transform = CGAffineTransformMakeRotation(angle); // for clockwise rotation
    

    *

    【讨论】:

    • 这是张贴者所做的,也是文档所说的,但正如一些人所指出的,文档似乎是错误的。你真的运行了这段代码并看到它工作了吗?
    • @tooluser,这个答案与 OP 或 Serhii Yakovenko 的答案并不矛盾。另一个例子见stackoverflow.com/questions/28717634/…
    • 是的,我现在正在运行这样的代码,但它不像你描述的那样工作。
    【解决方案4】:

    不要混淆。它在苹果文档中是错误的。

    CGAffineTransformMakeRotation(-angle) // 逆时针旋转 CGAffineTransformMakeRotation(angle) // 顺时针旋转

    【讨论】:

    • 如果角度大于 180 度则不会。
    【解决方案5】:

    我有一个简单的代码可以在不同方向旋转图像。

    int Count==1;
    - (IBAction)Btn_Image:(id)sender {
    if (Count==1) {
        Count = Count + 1;
        UIImage *image = [UIImage imageWithCGImage:self.Img_Selected.CGImage scale:1.0 orientation:UIImageOrientationRight];
        self.Img_Canvas.image = image;
    }
    else if (Count == 2) {
        Count = Count + 1;
        UIImage *image = [UIImage imageWithCGImage:self.Img_Selected.CGImage scale:1.0 orientation:UIImageOrientationDown];
        self.Img_Canvas.image = image;
    }
    else if (Count == 3) {
        Count = Count + 1;
        UIImage *image = [UIImage imageWithCGImage:self.Img_Selected.CGImage scale:1.0 orientation:UIImageOrientationLeft];
        self.Img_Canvas.image = image;
    }
    else if (Count == 4) {
        Count = 1;
        UIImage *image = [UIImage imageWithCGImage:self.Img_Selected.CGImage scale:1.0 orientation:UIImageOrientationUp];
        self.Img_Canvas.image = image;
    }}
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-27
      相关资源
      最近更新 更多