Подтвердить что ты не робот

Анимация iPhone на основе входных значений (прикосновений) не время

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

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

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

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

4b9b3361

Ответ 1

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

Что вы делаете в своем случае, это определение анимации для всех ваших пунктов меню, чтобы анимировать их позицию вдоль желаемого CGPath со времени t 0 до t 1, с соответствующим timeOffset для каждой анимации, чтобы ваши объекты располагались соответственно. Обратите внимание, что a beginTime 0.0 в анимации обычно интерпретируется как начало с момента добавления анимации на его уровень, поэтому, если вы хотите, чтобы t 0 равнялся 0.0, вам, вероятно, придется установить его на крошечный epsilon > 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 до значений между t 0 и t 1 в ответ на ваши события касания.

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

Ответ 2

Если вы ориентируетесь на iOS 4.0 или выше, вы можете использовать новые методы класса на основе блоков, чтобы начать анимационные изменения view. Поэтому из вашего события касания вы можете инициировать анимационное изменение свойств на представлении:

[UIView animateWithDuration:1.0 animations:^{
    yourView.alpha = 0.0; // fade out yourView over 1 second
}];

N.B. Это так же легко может быть изменено на другое свойство в представлении, например на его местоположение. Вы можете анимировать следующие свойства в представлении следующим образом:

@property frame
@property bounds
@property center
@property transform
@property alpha
@property backgroundColor
@property contentStretch

Если вы нацеливаете более ранние версии iOS, вам нужно будет использовать UIView beginAnimations и commitAnimations для создания блока анимации:

[UIView beginAnimations:nil context:context];
[UIView setAnimationDuration:1.0]; 
yourView.alpha = 0.0;
[UIView commitAnimations];

Этот материал работает очень хорошо, и как только вы начнете его использовать, вам нужно быть осторожным, чтобы вы не становились зависимыми.;)

Обновить для комментария:

Вы можете привязать положение мрамора к месту события касания. Как только вы получите touchesEnded, вы можете анимировать местоположение мрамора с помощью блока анимации.

Ответ 3

скорость = расстояние/время. Вы можете попробовать, откладывая задержку в зависимости от перемещений и времени. Вы можете рассчитать время между касаниямиBegan и touchs.Ended.

Ответ 4

Я не совсем уверен, что я точно понимаю, что вы хотите сделать, но... Почему бы просто не нарисовать мрамор, где бы ни находился пользовательский палец? Никакой анимации не требуется. Если вы хотите сохранить движение мрамора после того, как пользователь уйдет, вам нужно сохранить концепцию импульса и использовать его для оживления замедления мрамора. Вы можете использовать либо CoreAnimation для этого, либо таймер.

Ответ 5

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

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