20

我正在尝试使用 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));
                 }];

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

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

4

5 回答 5

19

这是文档中的错误。

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

在此处输入图像描述

如果您进行数学运算,您会看到对于正角度,当Y轴方向向上时(如OS X)顺时针方向旋转时,当Y轴方向向下时(如iOS 中),它会逆时针旋转

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

相同的文档仍然具有您引用的(错误)部分:

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

这显然是错误的,因为方程(这是同一文档的一部分并且是非常标准的旋转方程)说相反。

于 2013-11-08T15:55:42.840 回答
8

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

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

UIKit 和 Core Graphics 坐标系的比较


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

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

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

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

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

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


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

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

于 2016-12-13T17:08:16.843 回答
7

要获得逆时针旋转.. 在 -ve 中设置您的角度,例如:

*

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

*

于 2013-11-08T12:54:53.567 回答
0

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

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

于 2015-09-24T08:36:57.443 回答
0

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

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;
}}
于 2017-10-27T09:51:03.740 回答