6

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

   }
4

6 回答 6

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

于 2016-01-08T07:36:08.173 回答
2

编辑:看起来你会有一个进一步的问题:看起来你不能像在运行动画上那样改变值。您必须删除当前动画并添加一个具有更改值的新动画。当您添加新动画时,这可能需要小心以防止产生不和谐的效果。

从上面的线程中,您可以通过不重复动画来做到这一点,而是使用委托(参见此处)继续重新添加动画,并为下一个动画周期设置新速度。

原帖:

您正在更改最初传递给动画的值。这不会影响正在运行的动画。您需要获取对它的引用,并更改动画对象的持续时间属性。在您的操作方法中是这样的:

CABasicAnimation *a = [displayLabel.layer animationForKey:@"rotationAnimation"];
a.duration = slider.value;
于 2012-06-26T11:32:52.287 回答
1

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

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

这可能会产生不平稳的运动,但如果您使用非常小的片段,您也许可以将其平滑。

于 2012-06-27T12:04:36.077 回答
1

你应该停止动画并以新的持续时间重新开始

但请记住记录 fromValue 和 toValue ,并使用旧的 toValue 作为新的 fromValue 来执行无缝更改

于 2013-09-12T08:27:26.777 回答
0

如果您只想要自动滚动文本,那么您也可以使用一类

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

它也可能适用于你的情况,试试吧。

于 2012-06-26T12:52:57.630 回答
0

将速度设置为您需要的速度。

    a.duration=0.5;

尝试这个...

于 2012-06-26T11:10:25.820 回答