iOS CAKeyframeAnimation вращениеМод на UIImageView

Я экспериментирую с анимацией по ключевому кадру положения объекта UIImageView, движущегося по безье-траектории. Эта картинка показывает начальное состояние до анимации. Синяя линия - это путь - изначально движущийся прямо вверх, светло-зеленый прямоугольник - это начальный ограничивающий прямоугольник или изображение, а темно-зеленый «призрак» - это изображение, которое я двигаю:

Когда я запускаю анимацию с вращением, установленным вnilизображение сохраняет ту же ориентацию на всем пути, как и ожидалось.

Но когда я запускаю анимацию с вращением, установленным вkCAAnimationRotateAuto, изображение немедленно поворачивается на 90 градусов против часовой стрелки и сохраняет эту ориентацию на всем протяжении пути. Когда он достигает конца пути, он перерисовывается в правильной ориентации (ну, на самом деле он показывает UIImageView, который я переместил в окончательное местоположение)

Я наивно ожидал, что RotateMode будет ориентировать изображение по касательной к траектории, а не по нормали, особенно когда документы Apple дляCAKeyframeAnimation вращениеМод государство

Определяет, вращаются ли объекты, анимируемые вдоль пути, в соответствии с касательной к пути.

Итак, каково решение здесь? Нужно ли предварительно поворачивать изображение на 90 градусов по часовой стрелке? Или мне чего-то не хватает?

Спасибо за вашу помощь.

Изменить 2 марта

Я добавил шаг вращения перед анимацией пути, используя вращение Affine, например:

theImage.transform = CGAffineTransformRotate(theImage.transform,90.0*M_PI/180);

и затем после анимации пути, сбросьте вращение с помощью:

theImage.transform = CGAffineTransformIdentity;

Это заставляет изображение следовать по пути ожидаемым образом. Однако сейчас я сталкиваюсь с другой проблемой мерцания изображения. Я уже ищу решение проблемы мерцания в этом вопросе SO:

iOS CAKeyFrameAnimation масштабирует мерцание в конце анимации

Так что теперь я не знаю, сделал ли я вещи лучше или хуже!

Изменить 12 марта

Хотя Калеб отметил, что да, мне пришлось предварительно повернуть изображение, Роб предоставил потрясающий пакет кода, который почти полностью решил мои проблемы. Единственное, что Роб не сделал, это компенсировало, что мои активы были нарисованы с вертикальной, а не горизонтальной ориентацией, таким образом, все еще требуя предварительно повернуть их на 90 градусов перед выполнением анимации. Но эй, это справедливо, что я должен сделать часть работы, чтобы все заработало.

Так что мои небольшие изменения в решении Роба для наборамой Требования:

Когда я добавляю UIView, я предварительно поворачиваю его, чтобы противостоять внутреннему вращению, добавленному путем установкиrotationMode:

theImage.transform = CGAffineTransformMakeRotation (90 * M_PI / 180.0);

Мне нужно сохранить это вращение в конце анимации, поэтому вместо того, чтобы просто обрабатывать преобразование вида новым масштабным коэффициентом после определения блока завершения, я строю масштаб на основе текущего преобразования:

theImage.transform = CGAffineTransformScale (theImage.transform, scaleFactor, scaleFactor);

И это все, что я должен был сделать, чтобы мой образ шел по пути, как я ожидал!

Изменить 22 марта

Я только что загрузил на GitHub демонстрационный проект, который демонстрирует перемещение объекта по более беззаконному пути. Код можно найти по адресуPathMove

Я также написал об этом в своем блоге наПеремещение объектов по безье в iOS

Ответы на вопрос(3)

Ваш ответ на вопрос