【问题标题】:Why does calling my CABasicAnimation not work in viewDidAppear?为什么在 viewDidAppear 中调用我的 CABasicAnimation 不起作用?
【发布时间】:2014-04-22 04:58:10
【问题描述】:

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

我做错了什么?

【问题讨论】:

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


    【解决方案1】:

    您的解决方案(延迟性能)非常出色,因此确实没有问题。唯一的问题是为什么您的代码在没有延迟性能的情况下无法工作。我怀疑这与以下几行有关:

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

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

    【讨论】:

    • 因此,我的dispatch_after 补救措施或多或少称这为苹果方面的错误是否安全?
    • 不,我根本不会称之为错误。某些重要的事情只有在你的所有代码完全运行后才会发生,在运行循环/事务结束时,包括布局、绘图和动画,这是关于 iOS 工作原理的一个重要事实;这是其效率和独创性的一部分,也是所有 iOS 程序员都需要了解的。正是出于这个原因,延迟性能让 runloop 循环一次是一种有价值的程序员工具箱技术。
    • 通过使用该技术,您只是按顺序处理,对运行时说:(1)添加我的子视图; (2) 在您完成与步骤 1 相关的所有内务处理后给我回电; (3) 啊,谢谢你的回调,现在将这个动画添加到渲染树中。
    • 很公平。谢谢。
    猜你喜欢
    • 2011-05-16
    • 1970-01-01
    • 1970-01-01
    • 2015-08-14
    • 2014-04-12
    • 2011-04-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多