为什么在viewDidAppear中调用我的CABasicAnimation不起作用?

时间:2014-03-17 04:01:26

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

viewDidAppear中,我调用以下代码:

MyView *myView = [[MyView alloc] initWithFrame:CGRectMake(100, 100, 100, 100)];
myView.backgroundColor = [UIColor clearColor];

[self.view addSubview:myView];

[myView setProgress:0.3 animated:YES];

最后一行调用此方法:

- (void)setProgress:(CGFloat)progress animated:(BOOL)animated {
    self.innerPie.hidden = NO;

    self.innerPie.strokeEnd = progress;

    CABasicAnimation *pathAnimation = [CABasicAnimation animationWithKeyPath:@"strokeEnd"];
    pathAnimation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionLinear];
    pathAnimation.duration = 3.0;
    pathAnimation.fromValue = [NSNumber numberWithFloat:self.progress];
    pathAnimation.toValue = [NSNumber numberWithFloat:progress];
    [self.innerPie addAnimation:pathAnimation forKey:@"strokeEndAnimation"];

    self.progress = progress;
}

然而,当我加载模拟器时,动画从不启动。为什么?如上所示,该观点是否已经出现?

奇怪的是,如果我使用dispatch_after延迟0秒(即时),显示。

dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
    [myView setProgress:0.8 animated:YES];
});

我做错了什么?

1 个答案:

答案 0 :(得分:4)

您的解决方案(延迟性能)非常出色,所以确实没问题。唯一的问题是,如果没有延迟性能,您的代码将无法运行。我怀疑它与这些线有关:

[self.view addSubview:myView];
[myView setProgress:0.3 animated:YES];

您已经命令将MyView添加到界面中,但显然它还没有添加 ,至少不是这样,界面已经安定下来我们准备好了将动画添加到图层渲染树。你的延迟性能完全符合我们所需要的:我们等待一个循环的运行循环,现在界面(包括添加的MyView)已准备好摇滚。