如何通过底部中心旋转图像?

时间:2013-08-18 23:10:31

标签: ios objective-c cocoa-touch core-graphics

我尝试通过将视图图层的 anchorPoint属性设置为CGPointMake(0.5, 1)来旋转图像的底部中心。它确实根据底部中心旋转,但图像视图底部中心被转换为图像视图中心位置,因此整个图像被转换为​​图像高度的一半。如何使图像视图保持其中心但仍然围绕它的底部中心旋转?

以前有没有人遇到过这个问题?

嘿伙计们这是一个关于我希望旋转如何处理图像的图片演示!

enter image description here

这是原始未转换的图像! 如你所见,我已经用红点表示图像的底部中心。

enter image description here

这是旋转的图像。图像顺时针旋转了几度。这已经被它的中心旋转了,这也不是我想要的!

enter image description here

使用Calebs发布的变换后获得的图像答案。注意:变换应用于包含上述垂直图像的图像视图!正如您可以看到旋转中的缺陷,底部中心已经上升甚至旋转它有所不同。它采取了180度旋转,整个图像向上移动了一段距离。

重申一下,我只是希望图像像时钟针一样旋转,但是它的底部中心

谢谢!

1 个答案:

答案 0 :(得分:1)

假设您要旋转绘制图像的视图,通常的方法是从三个单独的矩阵组成变换矩阵。第一个将图像左侧宽度翻译一半。第二个旋转视图。第三个将图像右移一半宽度(即它是第一个的倒数)。当你将这三个放在一起时,你得到一个矩阵,使图像围绕它的底部中心旋转。

例如,如果你有:

CGFloat x = imageWidth/2.0;
CGFloat r = 1.0; // some value in radians;

你可以设置这样的转换:

CGAffineTransform t1 = CGAffineTransformMakeTranslation(-x, 0);
CGAffineTransform t2 = CGAffineTransformRotate(t1, r);
CGAffineTransform t3 = CGAffineTransformTranslate(t2, x, 0);

t3是最后一个转换,它将一步翻译,旋转和翻译。如果您将t3设置为图片视图的变换,则会发现视图围绕底部中心旋转了1.0弧度(或者您设置r的任何内容)。

除了纠正我之前的错误之外,Peter Hosey的评论指出另一种选择是旋转图层而不是视图。我不认为这是你正在寻找的东西,但如果它是你应该知道一层上的转换是关于它的anchorPoint,它默认设置为它的边界矩形的中心。要围绕边界矩形的底部中心旋转,可以先将锚点设置为底部中心,然后应用旋转变换。 (请注意,图层的transform属性为CATransform3D;如果您要使用上述仿射变换,请使用setAffineTransform:方法。)