如何可靠地围绕点旋转图像?

时间:2013-10-10 19:22:12

标签: ios objective-c transformation affinetransform

我已经从One step affine transform for rotation around a point?了解了以下内容:

CGAffineTransform transform = CGAffineTransformMakeTranslation(x, y);
transform = CGAffineTransformRotate(transform, a);
transform = CGAffineTransformTranslate(transform,-x,-y);

然而,当我这样做时,转换的图像遍布地图,很少在屏幕上。

我已经尝试过制作一个可以放置图像的系统;如果运行循环并放置多个值,则会出现螺旋线。然而,虽然我可能最终能够解开图像旋转和我希望它们旋转的点之间的关系,但我想要求最好的解决方案,我在这里有一个图像;我认为这一点是它的中心;我希望它围绕它的中心旋转这个数量但不会被取代。"

我正在尝试修改http://JonathansCorner.com/ancient-clock/的端口,现在我正在尝试放置时针。所有尝试在上面进行歌曲和舞蹈,并将其翻译成其中心位于所需中心的尝试都失败了。

对于这个时钟的手,我能怎么说"我希望手在下面的轮换"并将它们适当放置在中心周围?

- 编辑 -

此代码的关键部分是:

,用于尝试使用图层来响应评论
UIImage *hourHandImage = [UIImage imageNamed:@"hour-hand.png"];
UIImageView *hourHandView = [[UIImageView alloc] initWithImage:hourHandImage];
float hourRotation = .5;
hourHandImage = [UIImage imageNamed:@"hour-hand.png"];
hourHandView = [[UIImageView alloc] initWithImage:hourHandImage];
CGAffineTransform transform = CGAffineTransformMakeTranslation(centerX - 21, -centerY - 121);
// transform = CGAffineTransformRotate(transform, hourRotation);
// transform = CGAffineTransformTranslate(transform, 2 * centerX, 2 * centerY);
hourHandView.transform = transform;
hourHandView.layer.anchorPoint = CGPointMake(centerX, centerY);
hourHandView.layer.affineTransform = CGAffineTransformRotate(transform, hourRotation);
[self.view addSubview:hourHandView];

谢谢,

- 编辑 -

我现在有些东西减少了;如果我遵循一些指示,我有:

CGAffineTransform transform = CGAffineTransformMakeTranslation(100 -21, 100 -121);
transform = CGAffineTransformRotate(transform, hour / 12.0 * M_PI * 2.0);
transform = CGAffineTransformTranslate(transform, -330, 330);
hourHandView.transform = transform;

我想努力获取这些数字,但这已经正确显示了9点的小时。

感谢您的帮助!

4 个答案:

答案 0 :(得分:11)

旋转始终围绕(0,0)进行。

要转换您需要将旋转点转换为(0,0)所需的点 然后旋转它,然后将其翻译回来。

所以它应该是:

// cx, cy is center of screen
// move (cx,cy) to (0,0)  
CGAffineTransform transform = CGAffineTransformMakeTranslation(-cx, -cy);

// roate around (0,0)  
transform = CGAffineTransformRotate(transform, angleRadians);

// mov e (0,0) back to (cx,cy)  
transform = CGAffineTransformTranslate(transform,cx,cy);

答案 1 :(得分:10)

这一行:

CGAffineTransform transform = CGAffineTransformMakeTranslation(x, y);

将图像移动x,y。

(注意 - 你将围绕控制点旋转,无论你设置的是什么)

这一行:

transform = CGAffineTransformRotate(transform, a);

围绕控制点旋转。

如果您的控制点位于左上角(默认设置),它将围绕左上角旋转。

您需要设置:

[self layer].anchorPoint = CGPointMake(0.5, 0.5);

让它围绕图层的中心旋转。

答案 2 :(得分:7)

hourImageView.layer.anchorPoint = CGPointMake(0.5f, 0.9f);
CGFloat angle = hour / 12.0 * M_PI * 2.0;
hourHand.transform = CGAffineTransformMakeRotation(angle);

答案 3 :(得分:1)

Alex的答案中的Swift 5版本

旋转始终围绕(0,0)进行。

要转换您需要将旋转点转换为(0,0)然后旋转它,然后将其转换回来的点。

所以它应该是:

// centerX, centerY is center of screen
// move (centerX,centerY) to (0,0)  
var myTransform = CGAffineTransform(translationX: -centerX, y: -centerY)

// rotate around (0,0)  
myTransform = myTransform.concatenating(CGAffineTransform(rotationAngle: angleInRadians))

// move (0,0) back to (cx,cy)  
myTransform = myTransform.concatenating(CGAffineTransform(translationX: centerX, y: centerY))

myView.transform = myTransform