О 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 Rotation]()
![After 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));
}];
Он имеет тот же результат, вращение по часовой стрелке.
Может кто-нибудь объяснить, почему, спасибо за ответ.
Ответы
Ответ 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;
}}