记住坐标变换的一件事情——其中之一是你不是在操作对象,就像图形编辑器中的Transform命令那样; 你正在操纵空间本身。想象一下设备被鹅颈臂悬挂在桌子上,并固定在位置上。坐标变换将移动桌子(平移),将其向左或向右旋转,甚至使其变形(缩放)。另一件关于坐标变换的事情要记住的是变换始终相对于原点。想象一下你的桌子从一个角开始——对应于视图的一个角——直接在屏幕上找到你的视图结束的角落。平移移动桌子的角落和桌子的其余部分,将其滑动到屏幕下方的某个地方。旋转将桌子围绕那个角旋转。还有一件事:变换影响未来而不是过去。先绘制某些东西,然后尝试变换它是行不通的,因为你没有变换你所绘制的内容,而是变换了你要绘制的空间。因此,我们需要在将图像放置在正确的位置之前移动桌子。(我提到最后这部分是因为你有几个变换命令立即被CGContextRestoreGState调用撤消。它们之间没有绘图可以影响。)因此,让我们从未旋转的图像矩形开始。
CGRect imageRect = { pointWhereYouWantTheImageCentered, doodad.size };
现在,CGContextDrawImage
需要一个矩形,但正如你所知,它将从该矩形的左下角绘制图像,而不是中心。(因此有了这整个操作。)
所以,这就是你要做的事情。在最后,你将不会在上面显示的那个点上绘制图像,而是在零点处 - 也就是桌子的角落。(不是在角落中心,而是将图像的角放在桌子的角落。)
那怎么做呢?这需要一些设置。您需要移动您的桌子。
首先,您需要将桌子向上和右移动,直到桌子的原点角位于所需的中心点:
CGContextTranslateCTM(context, imageRect.origin.x, imageRect.origin.y)
然后你需要旋转(以其原点为中心旋转桌子):
CGContextRotateCTM(context, angleInRadians);
然后将桌子向下和向左移动图像宽度和高度的一半:
CGContextTranslateCTM(context, imageRect.size.width * -0.5, imageRect.size.height * -0.5);
最后,把图片放在桌子的角落。
CGContextDrawImage(context, (CGRect){ CGPointZero, imageRect.size }, [doodad CGImage]);
你的桌子移动后,矩形的中心正好位于屏幕上你想要图像居中的位置下方,因此图像就被居中对齐了。