иными словами, при перемещении касания производите расчет скорости с учетом направления предыдущей скорости. В конце касания, выстрелите блок, который переводит «мрамор», уменьшая скорость, когда вы отклоняете. Если пользователь снова перемещает шарик, изменяет локальную переменную, это, в свою очередь, ускоряет анимацию шарика или замедляет его / меняет направление в зависимости от направления касания.

ффекта анимации, идеально подходящего для группового подхода анимации, как показано наОтвет Брэда Ларсона здесьМне нужна анимация, чтобы продолжить в соответствии с входными данными. Конкретно касание и положение обнаруженных касаний. Легко обрабатывать touchesMoved: и устанавливать положение элементов для каждого прикосновения, но это не так гладко, как при использовании основного анимационного подхода.

Вообразите мрамор в желобчатом следе. Я хочу подтолкнуть мрамор в любую позицию с любой скоростью в одном или другом направлении. Анимация должна делать что-то подобное, перемещая визуальный элемент по пути в ответ на прикосновения. CAKeyframeAnimation имеет точный бит пути, но, кажется, всегда хочет основывать переход от кадра к кадру по истекшему времени, а не по какому-либо другому фактору и в одном направлении.

Обновление от 31 января - Спасибо всем за ответы, однако никто не решает проблему. У меня есть круглое меню, которое перетаскивается, чтобы выбрать опцию. Все это должно двигаться вместе, и я обошел его, используя представление, к которому применено вращательное преобразование и обратное вращательное преобразование, примененное к его подпредставлениям, поэтому все значки вращаются с соответствующей ориентацией колеса обозрения. Это действительно выглядит лучше, когда иконки анимированы по слегка овальному пути, хотя ... мраморное описание - это попытка прояснить, что я пытаюсь сделать. Может быть, лучше представить магниты, ориентированные на то, чтобы отталкивать все движение в канавке - двигайтесь один, и его соседи тоже движутся, но не обязательно в направлении, в котором перемещаемый магнит движется по кривой.

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

 Adam Eberbach04 июн. 2012 г., 02:35
Хм, это стало популярным вопросом. Ответ Pivot верен и хорошо сработал для меня в коде, написанном после вопроса.

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

Решение Вопроса

иерархическая природа сроков в слоях деревьев, чтобы достичь того, что вы ищете. Реализация объектовCAMediaTiming, которые включают в себя какCAAnimation а такжеCALayerнаследовать временное пространство от своего родителя, которое они могут изменять (с помощью масштабирования, сдвига и повторения) и распространять на своих потомков. Установивspeed свойство слоя до 0,0 и корректировкиtimeOffset свойство вручную, вы можете отделить этот слой (и все его подслои) от обычного понятия времени.

В вашем случае вы бы задали анимацию для всех элементов меню, чтобы анимировать их положение вдоль желаемогоCGPath от времениt0 вt1с соответствующимиtimeOffset на каждой анимации, чтобы держать ваши элементы соответствующим образом. Обратите внимание, чтоbeginTime 0.0 для анимации обычно интерпретируется как начиная с момента добавления анимации к ее слою, так что если вы хотитеt0 чтобы быть 0.0, вам, вероятно, придется установить его на крошечный эпсилон> 0.0.

CAKeyframeAnimation *animation = [CAKeyframeAnimation animationWithKeyPath:@"position"];
animation.beginTime = 1e-100;
animation.duration = 1.0;
animation.fillMode = kCAFillModeBoth;
animation.removedOnCompletion = NO;
animation.path = path;
animation.calculationMode = kCAAnimationPaced;
animation.timeOffset = timeOffset;

Затем вы установитеspeed свойство 0.0 на родительском слое (содержащем только эти пункты меню) и обновите егоtimeOffset к значениям междуt0 а такжеt1 в ответ на ваши сенсорные события.

Этот подход имеет два возможных предостережения. Поскольку вы перенимали природу времени в этом поддереве слоя, вы, вероятно, не сможете одновременно анимировать другие свойства. Кроме того, если вам нужно быстрое движение, вам, вероятно, придется анимировать время вперед самостоятельно.

 Adam Eberbach02 февр. 2011 г., 22:14
Отличная идея! Я принимаю его, поскольку он дает необходимый мне уровень контроля, даже если он не совсем привязывает анимацию к позиции касания. Должна быть возможность манипулировать timeOffset, чтобы сделать его очень похожим на одно и то же.
 Pivot04 февр. 2011 г., 20:10
Если взаимосвязь между положением касания и ходом анимации линейная, вы можете просто выбрать beginTime и продолжительность анимации, чтобы можно было передать соответствующий компонент вашей позиции касания как timeOffset и применить для сопоставления времени и прогресса в Core Animation эту связь для вы.

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