在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];
});
我做错了什么?
答案 0 :(得分:4)
您的解决方案(延迟性能)非常出色,所以确实没问题。唯一的问题是,如果没有延迟性能,您的代码将无法运行。我怀疑它与这些线有关:
[self.view addSubview:myView];
[myView setProgress:0.3 animated:YES];
您已经命令将MyView添加到界面中,但显然它还没有添加 ,至少不是这样,界面已经安定下来我们准备好了将动画添加到图层渲染树。你的延迟性能完全符合我们所需要的:我们等待一个循环的运行循环,现在界面(包括添加的MyView)已准备好摇滚。