2013-08-18 3 views
1

Я пытался повернуть изображение на его нижней части центра, установив свойство anchorPoint взглядов слоя CGPointMake(0.5, 1) .Это сделали поворот на основе центра нижней, но вид изображения нижнего центр был переведен на мнения изображений центр, и, таким образом, изображение было переведено наполовину на высоту изображения. Как получить изображение, сохраняющее его центр, но все же вращаясь вокруг его нижнего центра?Как повернуть изображение по нижнему центру?

Неужели кто-нибудь когда-либо сталкивался с этой проблемой раньше?

Эй, ребята, это изобразительная демонстрация того, как я хочу, чтобы вращение работало над изображениями!

enter image description here

Это оригинальное нетрансформированное изображение! Как вы можете видеть, я поставил красную точку, чтобы указать нижний центр изображения.

enter image description here

Здесь повернутое изображение качественных изображений повернуто по часовой стрелке на несколько degrees.This повернуто относительно его центра, который опять-таки не то, что я хочу !!

enter image description here

Изображение, полученное после применения tranforms разместил в Calebs answer..Note: Преобразования были применены на изображении зрения, что дома выше изображения по вертикали, как вы можете увидеть недостатки в ротацию нижний центр имеет и даже поворот был другим. Он занимал 180 градусов, и весь образ был переведен на некоторое расстояние.

Повторюсь, я просто хочу, чтобы повернуть изображение, как иглы часы, но о его центре нижней

Спасибо!

+0

Вы можете размещать изображения того, как вы хотите, чтобы он работал, и как он на самом деле за работой? (будет проще для всех понять) –

+1

Может быть полезно создать слайдер, который меняет ваш угол поворота, начинать его с нуля, а затем перетаскивать ползунок, чтобы точно увидеть, как трансформация идет целиком. –

+0

@PeterHosey Сделаю это! –

ответ

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) о нижнем центре.

В дополнение к исправлению моей более ранней ошибки, комментарий Питера Хосей указывает, что другой вариант заключается в том, чтобы повернуть слой вместо представления. Я не думаю, что это то, что вы ищете, но если это так, вы должны знать, что происходят преобразования на слое, это anchorPoint, который по умолчанию установлен в центр его границ.Чтобы повернуть вокруг нижнего центра прямоугольника rect, вы можете сначала установить опорную точку в нижний центр, а затем применить преобразование вращения. (Обратите внимание, что свойство transform слоя является CATransform3D, если вы хотите использовать аффинное преобразование, как указано выше, используйте метод setAffineTransform:.)

+0

Обычно вы вращаетесь вокруг нижнего центра, переведя влево, а не вверх (а затем вправо, а не вниз, для обратного перевода в конце). Вы предлагаете вертикальный перевод из-за «якорной точки» Core Animation? –

+0

@PeterHosey - вы совершенно правы. Назовите это временным безумием - думал о центре взгляда как о происхождении. Я исправил свой ответ в этом отношении. Я не рассматривал возможность вращения слоя, но это хороший момент, поэтому я добавил эту возможность. Спасибо за очень полезный комментарий. – Caleb

+0

Добро пожаловать. У меня очень мало опыта в Core Animation, поэтому моя фраза - для всего, что я знал, это могло быть то, что вы имели в виду. Но теперь, когда вы упоминаете вращение слоя, он напоминает мне о чем-то, что я видел некоторое время назад: вы можете поворачивать слой с помощью KVC, не создавая собственного преобразования. Например, '[layer setValue: @ ((M_PI * 2.0) /6.0) forKey: @" transform.rotation.z "]' (непроверенный код) должен вращать одну шестую часть круга вокруг оси Z. http://developer.apple.com/library/ios/documentation/Cocoa/Conceptual/CoreAnimation_guide/Key-ValueCodingExtensions/Key-ValueCodingExtensions.html –