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

问题描述 投票:0回答:1

请考虑以下动画:

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;

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

我试图在animationDidStop委托方法中更改它。这大部分都有效,但即使放入CATransaction以禁用动画,也会导致strokeEnd在0处短暂闪现。我也玩过additivecumulative属性无济于事。有什么建议?

ios core-animation calayer
1个回答
9
投票

您只需将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是隐式可动画的(因此该行本身会导致动画),我们将首先关闭隐式动画:

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

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

© www.soinside.com 2019 - 2024. All rights reserved.