ios - 为什么我不能让我的动画持续时间为 0 秒?我将如何正确地做到这一点?

标签 ios objective-c cocoa-touch core-animation calayer

我正在尝试使用 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/

相关文章:

ios - Xamarin 无法识别已安装的字体

ios - 从 C 调用 Obj-C 方法

ios - 使用 for 循环设置数组中的值

iphone - iOS 第二语言本地化

ios - 抓取 SKNode 并露出其下方的 SKNode ,效果就像删除有雾的玻璃

iphone - 使用 "dispatch_queue_t"解析自定义表格单元格中的图像无法正常工作

ios - Booking.com 如何以编程方式关闭他们的应用程序?

iphone - 构建警告 : Disabling subview autoresizing is not supported on iPhone OS versions prior to 3. 0

iPhone - 一次弹出多个表单

cocoa - 将 NSDate 格式化为年、月、日、时、分、秒的特定样式