我正在尝试使用 Core Animation 构建饼图动画,但遇到了问题。我希望能够为其设置动画(因此使用 Core Animation),但也能够轻松关闭动画。
- (void)setProgress:(CGFloat)progress animated:(BOOL)animated {
self.innerPie.hidden = NO;
self.innerPie.strokeEnd = progress;
if (animated) {
CABasicAnimation *pathAnimation = [CABasicAnimation animationWithKeyPath:@"strokeEnd"];
pathAnimation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionLinear];
pathAnimation.duration = (animated) ? 2.0 : 0.0;
pathAnimation.fromValue = [NSNumber numberWithFloat:self.progress];
pathAnimation.toValue = [NSNumber numberWithFloat:progress];
[self.innerPie addAnimation:pathAnimation forKey:@"strokeEndAnimation"];
}
self.progress = progress;
}
这是我的代码。如果我将 animated
设置为 NO
,动画仍然会出现,只是速度快得多。为什么?我如何更改它以便它是即时的?
最佳答案
strokeEnd
是图层的动画属性 - 在本例中为 CAShapeLayer(否则您无法尝试使用 animationWithKeyPath
制作动画)。
好吧,设置图层的动画属性可以让变化动起来!这被称为(至少我)隐式动画。
所以这一行本身就引起了动画:
self.innerPie.strokeEnd = progress;
为防止出现这种情况,您必须暂时关闭隐式动画。有多种方法可以做到这一点;通常的做法是通过调用 CATransaction 类方法 setDisableActions:
在事务级别禁用它(显然是 YES)。
关于ios - 为什么我不能让我的动画持续时间为 0 秒?我将如何正确地做到这一点?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22468352/