2010-06-13 46 views
6

我有一个100x100像素的图像,我想绘制在围绕图像中心旋转的各个角度。以下代码有效,但围绕坐标系的原始坐标旋转(左上角)而不是翻译的位置。因此,图像不会围绕自身旋转,而是围绕屏幕的左上角旋转。CGContext旋转

以下代码是在空白应用程序的自定义视图中运行的,除此之外没有别的。

- (void)drawRect:(CGRect)rect { 
    CGContextRef context = UIGraphicsGetCurrentContext(); 
    CGContextTranslateCTM(context, -50, -50); 
    CGContextRotateCTM (context, 0.3); 
    CGContextTranslateCTM(context,768/2,1024/2); 
    [image drawAtPoint:CGPointMake(0,0)]; 
} 

我试着用CGAffineTransform做同样的事情,但得到了相同的结果。

+2

请勿硬编码屏幕尺寸。正如22年前Mac开发人员发现的那样,iPhone开发人员上周重新发现,屏幕的尺寸不会永远保持不变。做一个大忙,问问屏幕有多大。准备好iPad的像素尺寸改变的那一天。 – 2010-06-14 06:41:52

+0

我认为你所需要做的就是在旋转之前进行翻译。移动到屏幕中心的第二个平移将无法按预期工作,因为它将处于旋转坐标中。 – drawnonward 2010-06-14 07:20:16

+1

屏幕尺寸只是硬编码,因为这是一个简化的样本来解决我的问题...我的实际代码没有这样的假设:-) – kasperjj 2010-06-14 08:12:57

回答

22

旋转始终是关于原点;你需要做的不是打败那个,而是要利用它。

这里要记住的关键是翻译移动原点。所以,如果你想拥有在屏幕的中心为中心的形象和周围的中心旋转图像,你需要做的是:

  1. 移动原点到屏幕的中心。
  2. 旋转所需的量。 (想象一下,当你这样做时,x轴的极端移动;左端向下倾斜,右端向上倾斜)。
  3. 将原点“左”和“下”(这两个都沿着新的x和y轴)减去图像大小的一半。

想象一下,通过这些步骤中的每一步,图像在iPad上的运动。或者,更好的是,拿着便条纸并用手模拟它:

  1. 从iPad角落的笔记开始。
  2. 移动笔记,使笔记的角落位于iPad的中心。
  3. 旋转该角落附近的音符。
  4. 将音符“左”(相对于其自身)的宽度的一半和“下”(相对于其自身)移动一半高度。

你会注意到笔记结束了旋转,并在中心。