2013-10-10 4 views
7

Я прочитал следующее из 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/, и сейчас я пытаюсь поместить часовую стрелку. Все попытки сделать песню и танцевать выше, и перевести ее так, чтобы ее центр находился в желаемом центре, потерпел неудачу.

Как, для рук этих часов, могу ли я сказать «Я хочу руки в следующих поворотах» и разместить их по центру вокруг центра?

--EDIT--

Решающая часть этого кода, редактируемого в попытке использовать слои в ответ на замечание, является:

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]; 

Спасибо,

- EDIT--

Теперь у меня есть что-то повальное; если следовать некоторым инструкции, у меня есть:

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 правильно отображаются.

Спасибо за вашу помощь!

+0

У вас есть несколько примеров изображений вы можете отправлять сообщения? Что вы используете как 'x' и' y' здесь? Они должны быть соответственно половиной ширины и высоты ограничивающего прямоугольника того, что вы пытаетесь вращать. –

+0

Кроме того, что такое 'a'? Обратите внимание, что это должно быть выражено в радианах, а не в градусах. –

+0

Все геометрические манипуляции с точки зрения происходит вокруг точки привязки. Например, если anchorPoint = {0.5,0.5} (в центре), представление вращается, как если бы была ось z прямо через центр. Часовые стрелки вращаются почти вокруг наконечника, поэтому вам нужно что-то вроде hourHand.layer.anchorPoint = CGPointMake (0.5f, 0.9f); – Jano

ответ

6

Эта линия:

CGAffineTransform transform = CGAffineTransformMakeTranslation(x, y); 

перемещает изображение по х, у.

(Note-- вы вращаться вокруг контрольной точки, независимо вы установили, что быть)

эта линия:

transform = CGAffineTransformRotate(transform, a); 

вращается вокруг контрольной точки.

Если ваша контрольная точка находится в верхнем левом углу (по умолчанию), она будет вращаться вокруг верхнего левого угла.

Вы должны установить это:

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

, чтобы заставить его вращаться вокруг центра слоя.

+1

Кажется, вы также не поняли, как работают трассировки: Mak etranslation создает транс-матрицу, которая перемещает все точки на + x, + y; Рутэйт делает конкатенацию существующей матрицы преобразования и добавляет матрицу вращения вокруг (0,0). Если вы установите опорную точку, тогда ios в случае поворота сделает для вас две матрицы trandformatin: сначала переведите якорь на (0,0), сделайте свою ротацию, а затем переведите назад. – AlexWien

9

Вращение всегда выполняется вокруг (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); 
7
hourImageView.layer.anchorPoint = CGPointMake(0.5f, 0.9f); 
CGFloat angle = hour/12.0 * M_PI * 2.0; 
hourHand.transform = CGAffineTransformMakeRotation(angle); 
0

Swift 4,0

Вращение всегда делается вокруг (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 
Смежные вопросы