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

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]; }); 

我究竟做错了什么?

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

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

您已经命令将MyView添加到界面中,但显然它还没有真正添加,至少不是以接口已经安定下来并且我们准备将动画添加到图层渲染树的方式。 您的延迟性能完全满足所需:我们等待运行循环的一个循环,现在界面(包括添加的MyView)已准备好摇滚。