12

我已阅读以下内容,从一步仿射变换绕点旋转?

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:00 正确显示。

感谢你的帮助!

4

4 回答 4

13

旋转总是围绕 (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);
于 2013-10-10T19:34:42.167 回答
10

这一行:

CGAffineTransform transform = CGAffineTransformMakeTranslation(x, y);

将图像移动 x,y。

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

这一行:

transform = CGAffineTransformRotate(transform, a);

围绕控制点旋转它。

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

你需要设置这个:

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

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

于 2013-10-10T19:35:40.843 回答
8
hourImageView.layer.anchorPoint = CGPointMake(0.5f, 0.9f);
CGFloat angle = hour / 12.0 * M_PI * 2.0;
hourHand.transform = CGAffineTransformMakeRotation(angle);
于 2013-10-10T19:47:19.130 回答
2

来自 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
于 2018-01-31T15:18:19.777 回答