CABasicAnimation在完成时停止动画 - iOS

时间:2015-07-08 20:27:56

标签: ios objective-c core-animation uiviewanimation cabasicanimation

我有一个iOS应用,重复使用CABasicAnimation

    CABasicAnimation *fadeAnim = [CABasicAnimation animationWithKeyPath:@"opacity"];
    fadeAnim.fromValue = [NSNumber numberWithFloat:1.0];
    fadeAnim.toValue = [NSNumber numberWithFloat:0.2];
    fadeAnim.duration = 1.0;
    fadeAnim.autoreverses = YES;
    fadeAnim.repeatCount = INFINITY;
    [colourbutton.titleLabel.layer addAnimation:fadeAnim forKey:@"opacity"];

我有一个按钮,按下时意味着停止动画。

-(IBAction)stopAnim {
    [colourbutton.titleLabel.layer removeAllAnimations];
}

它工作正常,但我注意到的一件事是突然停止动画,它不会让动画完成。那么我怎么能让它完成当前动画然后停止。 (或者换句话说,我怎样才能将它传到removeAllAnimations....withAnimation?)。

在旁注中,我是否需要包含CoreAnimation框架才能实现此目的。到目前为止,动画正在运行,我没有导入CoreAnimation框架。

谢谢,Dan。

2 个答案:

答案 0 :(得分:2)

只需添加另一个动画,然后删除第一个动画:

    CABasicAnimation *endAnimation = [CABasicAnimation animationWithKeyPath:@"opacity"];
    endAnimation.fromValue = @(((CALayer *)colourbutton.titleLabel.layer.presentationLayer).opacity);
    endAnimation.toValue = @(1);
    endAnimation.duration = 1.0;
    [colourbutton.titleLabel.layer addAnimation:endAnimation forKey:@"end"];
    [colourbutton.titleLabel.layer removeAnimationForKey:@"opacity"];

这里的关键是使用表示层来获取当前状态。不要忘记设置图层的实际结束状态,因为动画将在完成时删除。

答案 1 :(得分:0)

在NKorotov的回答中,他使用presentationLayer找出你在动画中的位置。这是正确的方法。

你可以使用这个解决方案,虽然IMO你还需要正确计算持续时间动画(根据原始动画的持续时间以及你当前在动画路径上的距离)。

如果您发现添加新动画“愚蠢”,您可以在正确的时间使用removeAllAnimations来呼叫dispatch_after