我如何使一个图层保持CABasicAnimation的最终值

考虑下面的animation:

CABasicAnimation *pathAnimation = [CABasicAnimation animationWithKeyPath:@"strokeEnd"]; pathAnimation.duration = 1.0; pathAnimation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseOut]; pathAnimation.fromValue = [NSNumber numberWithFloat:0.0f]; pathAnimation.toValue = [NSNumber numberWithFloat:1.0f]; pathAnimation.removedOnCompletion = NO; pathAnimation.delegate = self; 

这将基本上激活图层从一端到另一端的绘制。 问题是一旦animation完成, strokeEnd属性将重置为0(最初设置的位置)。 我如何使最终的价值“坚持”?

我试图在animationDidStop委托方法中改变这个。 这大部分工作,但可以在0简要地引起一个strokeEnd ,甚至当放入一个CATransaction里面禁用animation。 我也玩过additivecumulative性质无济于事。 有什么build议么?

您只需将strokeEnd属性设置为最终值即可! 喜欢这个:

 // your current code (stripped of unnecessary stuff) CABasicAnimation *pathAnimation = [CABasicAnimation animationWithKeyPath:@"strokeEnd"]; pathAnimation.duration = 1.0; pathAnimation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseOut]; pathAnimation.fromValue = [NSNumber numberWithFloat:0.0f]; pathAnimation.toValue = [NSNumber numberWithFloat:1.0f]; // just add this to it: theLayer.strokeEnd = 1; // and now add the animation to theLayer 

如果strokeEnd是隐式animation的(所以这一行本身会引起animation),我们首先closures隐式animation:

 [CATransaction setDisableActions:YES]; theLayer.strokeEnd = 1; 

查看我的书,了解如何使用CABasicAnimation的完整细目: http : //www.apeth.com/iOSBook/ch17.html#_using_a_cabasicanimation

注意你的pathAnimation.removedOnCompletion = NO; 是错误的,其他答案的kCAFillModeForwards 。 两者都是基于对Core Animation如何工作的误解。