关于CGAffineTransformMakeRotation旋转方向?

tom*_*924 19 cgaffinetransform ios

我正在尝试使用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];
Run Code Online (Sandbox Code Playgroud)

在轮换之前 旋转后

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

#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));
                 }];
Run Code Online (Sandbox Code Playgroud)

它具有相同的结果,顺时针旋转.

有人可以解释原因,谢谢你的回复.

Ser*_*nko 16

这是文档中的错误.

在这里,他们描述矩阵并提供他们用来进行变换的方程式:

在此输入图像描述

如果你进行数学计算,你会发现,对于正角度,当Y轴方向向上时,它会逆时针旋转,如OS X中那样,当Y轴朝下时顺时针旋转,就像在iOS中一样

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

同一篇文档仍然有你引用的(假)部分:

在iOS中,正值指定逆时针旋转,负值指定顺时针旋转.在OS X中,正值指定顺时针旋转,负值指定逆时针旋转.

这显然是错误的,因为方程式(它们是同一文件的一部分并且是非常标准的旋转方程式)说明相反.


Ben*_*ane 8

这实际上是正确的行为,文档正确描述了它.

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

UIKit和核心图形坐标系的比较


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

以弧度表示的角度,此矩阵旋转坐标系轴.在iOS中,正值指定逆时针旋转,负值指定顺时针旋转.

乍一看似乎错了,但你错过了什么.这是来自CGAffineTransformMakeRotation参考的引用.这是Core Graphics参考的一部分,而不是UIKit参考.它指的是Core Graphics坐标系中的逆时针旋转.

您可以通过在屏幕上垂直翻转您所看到的内容并想象旋转的样子来描绘您的头部旋转.

事实上,CGAffineTransformMakeRotation参考有一个讨论项目,继续记录这个:

实际旋转方向取决于目标平台的坐标系方向,这在iOS和macOS中是不同的.


关于CGContext的rotate(by :)方法参考讨论项目更好地描述了这种行为:

在执行该函数之前,上下文旋转的方向可能看起来被当前变换矩阵的状态改变.例如,在iOS上,UIView将转换应用于反转Y轴的图形上下文(通过将其乘以-1).在先前翻转的坐标系上旋转用户坐标系导致在相反方向上旋转(即,正值似乎沿顺时针方向旋转坐标系).


Man*_*One 7

要获得逆时针旋转..使你的角度为-ve,例如:

*

imageToBeRotated.transform = CGAffineTransformMakeRotation(-angle); // for anti-clockwise rotation
imageToBeRotated.transform = CGAffineTransformMakeRotation(angle); // for clockwise rotation
Run Code Online (Sandbox Code Playgroud)

*