2012-06-26 98 views
5

在我的应用程序中,我将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; 

    } 
+0

[更改正在运行的动画的持续时间(速度)]的可能重复(https://stackoverflow.com/questions/21589483/change-duration-speed-on-a-running-animation) – Fattie

+0

**完整解决方案2017年** ...https://stackoverflow.com/a/45787919/294884,唷 – Fattie

回答

0

设置速度为你所需要的。

a.duration=0.5; 

尝试......

+0

我想要基于滑块值的动态速度。对于静态值,动画是完全正确的 –

2

编辑:看起来你将有进一步的问题,虽然:它不look like你可以在正在运行的动画改变这样的价值。您将不得不删除当前的动画并添加一个新的值。在添加新动画时,这可能需要小心以防止产生震动效果。

从上面的线程可以通过不重复动画来完成此操作,而是使用委托(see here)继续重新添加动画,并为下一个动画循环设置新速度。

原帖:

你正在改变,你已到动画最初传递的价值。这不会影响正在运行的动画。您需要获取对该对象的引用,并更改动画对象的duration属性。像这样的事情在你的操作方法:

CABasicAnimation *a = [displayLabel.layer animationForKey:@"rotationAnimation"]; 
a.duration = slider.value; 
+0

上面的代码没有任何反应。 –

+0

我已经仔细研究过它,并且无法更改正在运行的动画的值。看到我的编辑 – jrturton

+0

这里是你如何使一个**可重新启动的动画**这些天在iOS .. https://stackoverflow.com/a/45787919/294884 – Fattie

1

我认为jrturton是正确的,你不能改变已经运行的动画的属性。但是,您可以做的是将动画分成短片段,并在滑块值更改时更改下一个片段的速度。

不是从A点到D点的动画,而是从A-B开始,然后是B-C,然后是C-D。使用父类的animationDidStop检查当前点,检查滑块值并启动下一个动画。

这可能会产生生涩的动作,但是如果使用非常小的片段,则可能可以将其平滑化。

1

ü应该停止动画并重新启动一个新的一个新的持续时间

但记得要记录下来fromValue和toValue,并使用旧toValue作为新fromValue进行无缝改变

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

+0

这是行不通的;这是无关的。 – Fattie

+0

@Fattie - 可能你正在寻找不同的东西。这是问题的确切答案。它非常适合我。 –

+0

我明白你的意思@LesNie - 是的,它会在某些情况下提供解决方案。但是,它会更改整个图层的时间范围。需要更改正在运行的动画的属性是一个常见问题(并且在iOS中令人生厌)。我没有在你的答案上点击“+1”:)新年快乐! – Fattie