2013-06-24 1 views
4

Я разрабатываю приложение, которое требует поворота колеса вокруг оси z с увеличением или уменьшением скорости колеса со временем. Я использую CABasicAnimation &, мой код выглядит следующим образом. В то время как я изменяю свойство скорости слоя на определенном интервале, он вызывает «дрожь» эффект колеса.Изменение скорости CALayer в CABasicAnimation при вращении колеса вызывает эффект рывков

/* ** */

CABasicAnimation* animation = [CABasicAnimation animationWithKeyPath:@"transform.rotation.z"]; 
animation.toValue = [NSNumber numberWithFloat:-2*M_PI]; 
animation.duration = 4.0f; 
animation.repeatCount = INFINITY; 
[animation setValue:@"left" forKey:@"side"]; 
[animation setDelegate:self]; 
animation.removedOnCompletion=NO; 
animation.fillMode = kCAFillModeForwards; 
animation.cumulative = YES; 

imageLeft.layer.beginTime = CACurrentMediaTime(); 
/************/ 

В таймере я варьировать скорость CALayer в ImageView следующим образом, где dPlayedPercentage является переменной.

imageLeft.layer.speed=1.0+dPlayedPercentage; 

[imageLeft.layer addAnimation:animation forKey:@"SpinAnimation"]; 

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

+0

Добавление следующий код исправил рывок в анимации. imageLeft.layer.timeOffset = [imageLeft.layer convertTime: CACurrentMediaTime() fromLayer: nil]; \t imageLeft.layer.beginTime = CACurrentMediaTime(); \t imageLeft.layer.speed = 1.0 + dPlayedPercentage; – Augus

ответ

9

Добавление следующего кода исправило рывок в анимации.

imageLeft.layer.timeOffset = [imageLeft.layer convertTime:CACurrentMediaTime() fromLayer:nil]; 
imageLeft.layer.beginTime = CACurrentMediaTime(); 
imageLeft.layer.speed=1.0+dPlayedPercentage; 
+0

+1 У меня была такая же проблема, как и анимация слоя, и я хотел изменить среднюю анимацию скорости без перезапуска анимации. Это помогло мне, спасибо. – Siegfoult

+0

@Augus @Siegfoult У меня есть аналогичная проблема, можете ли вы показать мне, как вы управляете значением 'dPlayedPercentage'. –

0

Для более динамического изменения скорости, я есть некоторые проблемы с предыдущим ответом (слой не рисунок на всех), так как timeOffset необходимо было рассчитано с новой скоростью в виду.

(источник https://coveller.com/2016/05/core_animation_timing)

Базовая формула для timeOffset является:
timeOffset = CACurrentMediaTime() - ((convertTime - beginTime) x speed)

В коде:

theLayer.speed = newSpeed 

let mediaTime = CACurrentMediaTime() 

let converedTime = theLayer.convertTime(mediaTime, to: nil) 

theLayer.beginTime = mediaTime 

let offset = mediaTime - ((converedTime - theLayer.beginTime) * Double(newSpeed)) 

theLayer.timeOffset = offset 

 Смежные вопросы

  • Нет связанных вопросов^_^