关于CGAffineTransformMakeRotation旋转方向?

时间:2013-09-11 02:31:29

标签: ios cgaffinetransform

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

Before Rotation After 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));
                 }];

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

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

5 个答案:

答案 0 :(得分:15)

这是文档中的错误。

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

enter image description here

如果你进行数学计算,你会看到为正角度,当 Y 轴方向向上时,它会给出旋转逆时针 Y 轴向下指向iOS中的 时,在OS X中顺时针

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

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

  

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

显然错误,因为方程式(同一文档的一部分,非常standard rotation equations)说的相反。

答案 1 :(得分:7)

要获得逆时针旋转,请将角度设为-ve 例如:

*

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

*

答案 2 :(得分:7)

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

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

Comparison of UIKit and Core Graphics coordinate systems

现在,让我们来看看你的引语:

  

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

乍一看,这似乎不对,但你错过了什么。这是CGAffineTransformMakeRotation reference的引用。这是 Core Graphics 引用的一部分,而不是UIKit引用。它指的是在Core Graphics'中逆时针的旋转。坐标系

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

事实上,CGAffineTransformMakeRotation引用有一个discussion item,继续记录下来:

  

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

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

  

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

答案 3 :(得分:0)

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

CGAffineTransformMakeRotation(-angle)//用于逆时针旋转 CGAffineTransformMakeRotation(角度)//顺时针旋转

答案 4 :(得分: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;
}}