Я экспериментирую с анимацией ключевого кадра положения объекта UIImageView, перемещающегося по пути безье. Этот рисунок показывает начальное состояние перед анимацией. Синяя линия - это путь - сначала движущийся прямо вверх, светло-зеленый квадрат - это начальная ограничивающая рамка или изображение, а темно-зеленый "призрак" - это изображение, которое я двигаю:
Когда я запускаю анимацию с параметром rotationMode, установленным на nil
, изображение сохраняет ту же ориентацию до конца, как и ожидалось.
Но когда я запускаю анимацию с параметром rotationMode, установленным на kCAAnimationRotateAuto
, изображение сразу поворачивается на 90 градусов против часовой стрелки и сохраняет эту ориентацию полностью через путь. Когда он достигает конца пути, он перерисовывается в правильной ориентации (ну, на самом деле это показывает UIImageView, который я переместил в конечном месте)
Я наивно ожидал, что rotationMode будет ориентировать изображение на касательную пути, а не на нормальную, особенно когда Apple документирует CAKeyframeAnimation rotationMode состояние
Определяет, вращаются ли объекты, перемещающиеся вдоль пути, в соответствии с тангенсом пути.
Так в чем же тут решение? Должен ли я предварительно поворачивать изображение на 90 градусов по часовой стрелке? Или есть что-то, что мне не хватает?
Спасибо за вашу помощь.
Изменить 2 марта
Я добавил шаг поворота перед анимацией пути, используя аффинное вращение, например:
theImage.transform = CGAffineTransformRotate(theImage.transform,90.0*M_PI/180);
а затем после анимации пути, сбросив вращение с помощью:
theImage.transform = CGAffineTransformIdentity;
Это заставляет изображение следовать по пути ожидаемым образом. Однако теперь я сталкиваюсь с другой проблемой мерцания изображения. Я уже ищу решение мерцающей проблемы в этом вопросе SO:
iOS CAKeyFrameAnimation масштабирование мерцает в конце анимации
Итак, теперь я не знаю, улучшилось или улучшилось ли я!
Редактировать 12 марта
Пока Калеб указал, что да, мне пришлось предварительно повернуть изображение, Роб предоставил потрясающий пакет кода, который почти полностью разрешил мои проблемы. Единственное, что не делал Роб, это компенсация за то, что мои активы были нарисованы с вертикальной, а не горизонтальной ориентацией, тем самым все еще требуя предварительно обработать их на 90 градусов, прежде чем делать анимацию. Но эй, его единственная ярмарка, что я должен выполнить часть работы, чтобы добиться успеха.
Итак, мои незначительные изменения в решении Rob для решения my:
-
Когда я добавляю UIView, я предварительно поворачиваю его, чтобы встретить встроенный поворот, добавленный установкой
rotationMode
:theImage.transform = CGAffineTransformMakeRotation (90 * M_PI/180.0);
-
Мне нужно сохранить это вращение в конце анимации, поэтому вместо того, чтобы просто трансформировать преобразование вида с помощью нового коэффициента масштабирования после определения блока завершения, я создаю масштаб, основанный на текущем преобразовании:
theImage.transform = CGAffineTransformScale (theImage.transform, scaleFactor, scaleFactor);
И это все, что мне нужно было сделать, чтобы мой образ прошел по пути, как я ожидал!
Изменить 22 марта
Я только что загрузил в GitHub демонстрационный проект, который показывает перемещение объекта по пути безье. Код можно найти на PathMove
Я также написал об этом в своем блоге в Перемещение объектов по пути безье в iOS