Почему представление меняет положение при его вращении с помощью CGAffineTransformMakeRotation

У меня есть следующая супер простая анимация, я в основном поворачиваю представление 2 радия из его исходного угла/центра, он вращается отлично, мое единственное недоразумение - это то, почему представление перемещается из его исходного положения, когда происходит поворот.

[UIView animateWithDuration:1.0 animations:^{
        self.someView.transform = CGAffineTransformMakeRotation( 2 );
    }];

Почему представление перемещается при повороте с помощью кода выше?

enter image description here

В настоящее время я пытаюсь определить информацию в CGAffineTransform Reference.

Понимание якоря point.

Я нашел эти потоки, но не нашел конкретного ответа. Почему вращение imageView, оно меняет позицию?

Спасибо большое

Ответы

Ответ 1

Я добавляю еще один ответ из-за запроса @fs_tigre. Проблема заключается в автоматических макетах в вашем файле xib, к сожалению, неизвестно, почему это влияет на преобразование.
Теперь вот шаги, которые я предпринял для решения проблемы:

1- сначала вам нужно избавиться от своего макета (да, вам нужно)
снимите флажок Использовать автоспуск
uncheck Use Autolayout

2- удалите все ограничения и авторезистирующие маски для вашего представления, которое будет повернуто, как на скриншоте (Здесь у меня есть моя синяя коробка, см. правую авторезистировку, ничего не выбрано)
enter image description here

Я сделал некоторые изменения для вашего кода вращения

self.someView.layer.anchorPoint = CGPointMake(0.5, 0.5);
    // one degree = pi/180. so...
    // rotate by 90
    CGFloat radians = (M_PI/180) * 90;
    [UIView animateWithDuration:1.0 animations:^{
        self.someView.transform = CGAffineTransformRotate(self.someView.transform, radians);
    }];

Нажмите rotate и увидите волшебство:)

Ответ 2

Вам нужно установить опорную точку вашего представления для поворота.

self.somview.layer.anchorPoint = CGPointMake(0.5, 0.5);

Затем запустите вращение.
Из документации Apple

@property(nonatomic) CGAffineTransform transform
Изменения в этом свойство может быть анимировано. Используйте startAnimations: context: class метод для начала и метод класса commitAnimations для завершения блок анимации. По умолчанию используется любое значение центра (или опорная точка при изменении) Ссылка: https://developer.apple.com/library/ios/documentation/GraphicsImaging/Reference/CALayer_class/Introduction/Introduction.html#//apple_ref/occ/instp/CALayer/anchorPoint

enter image description here
изображение отсюда http://www.raywenderlich.com/9864/how-to-create-a-rotating-wheel-control-with-uikit
- Как вы видите, опорная точка - это точка со значением от 0.0 до 1.0 для X и Y когда вы вращаете вращение вокруг этих точек
ПРИМЕЧАНИЕ. Вам нужно импортировать QuartzCore

Ответ 3

"Якорь" CGAffineTransformMakeRotation - это X, Y представления. Вы можете попробовать следующее:

CGPoint center = self.someView.center;
[UIView animateWithDuration:1.0 animations:^{
    self.someView.transform = CGAffineTransformMakeRotation( 2 );
    self.someView.center = center;
}];