Как изменить скорость во время анимации CABasicAnimation

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

        CABasicAnimation * a = [CABasicAnimation animationWithKeyPath:@"position"];
    [a setTimingFunction:[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionLinear]];

    CGPoint startPt = CGPointMake(self.view.bounds.size.width + displayLabel.bounds.size.width / 2,
                                  displayLabel.frame.origin.y);
    CGPoint endPt = CGPointMake(displayLabel.bounds.size.width / -2, displayLabel.frame.origin.y);

    [a setFromValue:[NSValue valueWithCGPoint:startPt]];
    [a setToValue:[NSValue valueWithCGPoint:endPt]];
    [a setAutoreverses:NO];
    [a setDuration:speeds];
    [a setRepeatCount:HUGE_VAL];
    [displayLabel.layer addAnimation:a forKey:@"rotationAnimation"];


    - (IBAction)speedSlider:(id)sender {

         speeds = slider.value;

   }

person Prerna chavan    schedule 26.06.2012    source источник
comment
Возможный дубликат Изменить продолжительность (скорость) бегущей анимации   -  person Fattie    schedule 21.08.2017
comment
Полное решение на 2017 год ... stackoverflow.com/a/45787919/294884, уф   -  person Fattie    schedule 21.08.2017


Ответы (6)


Я думаю, что лучший способ изменить скорость — это изменить систему времени вашего слоя.

displayLabel.layer.timeOffset =
     [displayLabel.layer convertTime:CACurrentMediaTime() fromLayer:nil]; 
displayLabel.layer.beginTime = CACurrentMediaTime(); 
displayLabel.layer.speed= slider.value;

Вы можете увидеть это заранее. https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/CoreAnimation_guide/AdvancedAnimationTricks/AdvancedAnimationTricks.html#//apple_ref/doc/uid/TP40004514-CH8-SW2

person Yu-Lin Wang    schedule 08.01.2016
comment
@Fattie - возможно, вы ищете что-то другое. Это точный и точный ответ на проблему. Это работает для меня прекрасно. - person Les Nie; 28.12.2017
comment
Я понимаю, что вы имеете в виду @LesNie, и да, в некоторых ситуациях это может помочь. Однако это изменяет шкалу времени для всего слоя. Необходимость изменить свойства работающей анимации — распространенная проблема (и раздражающе сложная в iOS). Я нажал +1 на ваш ответ :) С Новым годом! - person Fattie; 28.12.2017

РЕДАКТИРОВАТЬ: Похоже, у вас будет еще одна проблема: это не похоже, что вы можете изменять такие значения во время анимации. Вам придется удалить текущую анимацию и добавить новую с измененным значением. Это может потребовать некоторой осторожности, чтобы предотвратить нежелательный эффект при добавлении новой анимации.

Из приведенного выше потока вы можете сделать это, не повторяя анимацию, а используя делегат (см. здесь), чтобы повторно добавлять анимацию и вместо этого устанавливать новую скорость для следующего цикла анимации.

Исходный пост:

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

CABasicAnimation *a = [displayLabel.layer animationForKey:@"rotationAnimation"];
a.duration = slider.value;
person jrturton    schedule 26.06.2012
comment
Я изучил это немного больше, и вы не можете изменить значение работающей анимации. Смотрите мое редактирование - person jrturton; 26.06.2012
comment
вот как вы делаете перезапускаемую анимацию в наши дни в iOS. /а> - person Fattie; 21.08.2017

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

Вместо анимации из точки A в точку D вы бы анимировали из A-B, затем B-C, затем C-D. Используйте анимациюDidStop родительского класса, чтобы проверить текущую точку, проверить значение ползунка и запустить следующую анимацию.

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

person Wienke    schedule 27.06.2012

Вы должны остановить анимацию и перезапустить новую с новым временем продолжительности

но не забудьте записать fromValue и toValue и использовать старое значение toValue в качестве нового fromValue для плавного изменения.

person chings228    schedule 12.09.2013

установите скорость, как вам нужно.

    a.duration=0.5;

Попробуй это...

person Ayaz    schedule 26.06.2012
comment
Мне нужна динамическая скорость на основе значения ползунка. Анимация полностью подходит для статических значений - person Prerna chavan; 26.06.2012

Если вам просто нужен текст с автопрокруткой, вы также можете использовать один класс

http://blog.stormyprods.com/2009/10/simple-scrolling-uilabel-for-iphone.html

В вашем случае тоже может сработать, попробуйте.

person Yogesh Maheshwari    schedule 26.06.2012