2013-09-11 3 views
17

Я пытаюсь использовать CGAffineTransformMakeRotation, и я имею в виду Apple, документ, который говоритО CGAffineTransformMakeRotation направление вращения?

Угол в радианах, с помощью которых эта матрица вращает осей системы координат. В iOS положительное значение указывает вращение против часовой стрелки, а отрицательное значение указывает вращение по часовой стрелке. В OS X положительное значение указывает вращение по часовой стрелке, а отрицательное значение указывает вращение против часовой стрелки.

Итак, передаю параметр 90 градусов, он должен вращаться против часовой стрелки.
self.myView серый фон вид цвет, и красный квадрат вид только для SEE направления вращения

#define DEGREES_TO_RADIANS(x) (x * M_PI/180.0) 
CGAffineTransform rotation = CGAffineTransformMakeRotation(DEGREES_TO_RADIANS(90)); 
[self.myView setTransform:rotation]; 

Before Rotation After Rotation

Но почему это вращение по часовой стрелке?
Я пытаюсь использовать в тренажере и устройства оба имеют один и тот же результат, вращение по часовой стрелке
А потом Тринг использовать анимацию:

#define DEGREES_TO_RADIANS(x) (x * M_PI/180.0) 
CGAffineTransform rotation = CGAffineTransformMakeRotation(DEGREES_TO_RADIANS(90)); 
[UIView animateWithDuration:0.5 
       animations:^{ 
        self.myView.transform = rotation; 
       } 
       completion:^(BOOL finished) { 
        NSLog(@"%@", NSStringFromCGAffineTransform(self.myView.transform)); 
       }]; 

Он имеет тот же результат, вращение по часовой стрелке.

Может кто-нибудь объяснить, почему, спасибо за ответ.

+0

Мое предположение - ошибка в документации. – rdelmar

+0

Где ссылка на документацию, которую вы указали? – Suragch

+0

https://developer.apple.com/library/prerelease/ios/documentation/GraphicsImaging/Reference/CGAffineTransform/index.html#//apple_ref/c/func/CGAffineTransformMakeRotation – tom19830924

ответ

16

Это ошибка в документации.

Here они описывают матрицу и обеспечивают уравнения, которые они используют, чтобы сделать преобразование:

enter image description here

Если вы делаете математику, вы увидите, что при положительных углах, это дает вращение против часовой стрелки , когда Y направление оси вверх, как в OS X и по часовой стрелке, когдаУ оси направлена ​​вниз, как в прошивкой

Например, вы можете попытаться преобразовать точку (5,0) с 90 градусами, вы получите (0,5), что означает, по часовой стрелке для прошивки и против часовой стрелки для OS X.

Та же часть документации все еще есть (ложь) часть, которую вы цитируемый:

В прошивкой, положительное значение указывает против вращение и отрицательное значение указывает вращение по часовой стрелке.В OS X положительное значение указывает вращение по часовой стрелке, а отрицательное значение указывает вращение против часовой стрелки.

Который явно неправильно, потому что уравнения (которые являются частью одного и того же документа, и являются довольно standard rotation equations) говорят обратное.

+1

Idk об этом неправильно. Вы должны помнить, что вы находитесь в системе координат UIKit, а не в стандартной. Чтобы перейти к стандартному, вам нужно перевернуть ось x. В этот момент (вы можете представить его в голове) он вращается против часовой стрелки. –

7

Чтобы получить вращение против часовой стрелки .. сделать угол Ур в -ve например:

*

imageToBeRotated.transform = CGAffineTransformMakeRotation(-angle); // for anti-clockwise rotation 
imageToBeRotated.transform = CGAffineTransformMakeRotation(angle); // for clockwise rotation 

*

+0

Это то, что делает плакат, и какая документация говорит, но, как отметили некоторые, документация кажется неправильной. Вы действительно запускали этот код и видели, как он работает? – tooluser

+0

@tooluser да, это сработало для меня, –

+1

@tooluser, Этот ответ не противоречит ответу OP или Сергею Яковенко. См. Http://stackoverflow.com/questions/28717634/swift-how-can-you-rotate-text-for-uibutton-and-uilabel/28717635#28717635 для другого примера. – Suragch

0

Не путайте. Это неправильно в документации Apple.

CGAffineTransformMakeRotation (-угол) // для вращения против часовой стрелки CGAffineTransformMakeRotation (угол) // вращение по часовой стрелке

+2

Нет, если угол больше 180 градусов. –

6

Это действительно правильное поведение, и документация описывает это правильно.

Здесь вы имеете дело с двумя различными системами координат. Система координат Core Graphics имеет (0, 0) в левом нижнем углу, но система координат UIKit имеет (0, 0) в верхнем левом углу. Обе системы координат имеют ось X с 0 слева. Другими словами, система координат UIKit - это система координат Core Graphics, перевернутая вертикально. На следующем рисунке показана разница:

Comparison of UIKit and Core Graphics coordinate systems


Теперь давайте посмотрим на вашу цитату:

угол в радианах, с помощью которого эта матрица вращает координат системы осей. В iOS положительное значение указывает против часовой стрелки вращение, а отрицательное значение указывает вращение по часовой стрелке.

На первый взгляд кажется неправильным, но вы что-то пропустили. Это цитата из CGAffineTransformMakeRotation reference. Это часть ссылки Core Graphics, а не ссылка UIKit. Это относится к вращению против часовой стрелки в системе координат Core Graphics.

Вы можете изобразить это вращение в своей голове, перевернув то, что вы видите на экране по вертикали, и представляете, как будет выглядеть поворот.

В самом деле, ссылка CGAffineTransformMakeRotation имеет discussion item, который переходит к документу этого:

Фактическое направление вращения зависит от системы координат ориентации целевой платформы, которая отличается в прошивке и macOS.


discussion item on CGContext's rotate(by:) method reference описывает это поведение немного лучше:

направление, в котором контекст вращается, может казаться, быть изменен путем состояния текущей матрицы преобразования перед выполнением этого функция. Например, в iOS UIView применяет преобразование к графическому контексту, который инвертирует ось Y (путем умножения на -1).Вращение пользовательской системы координат в системе координат, которая была ранее перевернута, приводит к вращению в противоположном направлении (то есть положительные значения, по-видимому, поворачивают систему координат в по часовой стрелке).

0

У меня есть простой код для поворота изображения в противоположном направлении.

int Count==1; 
- (IBAction)Btn_Image:(id)sender { 
if (Count==1) { 
    Count = Count + 1; 
    UIImage *image = [UIImage imageWithCGImage:self.Img_Selected.CGImage scale:1.0 orientation:UIImageOrientationRight]; 
    self.Img_Canvas.image = image; 
} 
else if (Count == 2) { 
    Count = Count + 1; 
    UIImage *image = [UIImage imageWithCGImage:self.Img_Selected.CGImage scale:1.0 orientation:UIImageOrientationDown]; 
    self.Img_Canvas.image = image; 
} 
else if (Count == 3) { 
    Count = Count + 1; 
    UIImage *image = [UIImage imageWithCGImage:self.Img_Selected.CGImage scale:1.0 orientation:UIImageOrientationLeft]; 
    self.Img_Canvas.image = image; 
} 
else if (Count == 4) { 
    Count = 1; 
    UIImage *image = [UIImage imageWithCGImage:self.Img_Selected.CGImage scale:1.0 orientation:UIImageOrientationUp]; 
    self.Img_Canvas.image = image; 
}} 
Смежные вопросы