Подтвердить что ты не робот

О CGAffineTransformMakeRotation направление вращения?

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

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

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

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

Before RotationAfter Rotation

Но почему это вращение по часовой стрелке?
Я пытаюсь использовать в симуляторе, и устройство имеет одинаковый результат, вращение по часовой стрелке - И затем tring для использования анимации:

#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));
                 }];

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

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

4b9b3361

Ответ 1

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

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

enter image description here

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

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

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

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

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

Ответ 2

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

*

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

*

Ответ 3

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

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

Сравнение систем координат UIKit и Core Graphics


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

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

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

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

Фактически ссылка CGAffineTransformMakeRotation содержит элемент обсуждения, который продолжает документировать это:

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


Элемент обсуждения в отношении поворота CGContext (по ссылке метода:) описывает это поведение немного лучше:

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

Ответ 4

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

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

Ответ 5

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

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