我有一个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。
答案 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
。