动画未按照编写代码的顺序运行

Posted

技术标签:

【中文标题】动画未按照编写代码的顺序运行【英文标题】:Animation not running in the order that code is written 【发布时间】:2014-08-02 09:47:41 【问题描述】:

我正在尝试设置一个按钮,在作为我的根视图控制器的一部分的图像视图中播放动画,然后继续更改子视图控制器。

但由于某种原因,代码更改了视图控制器,然后播放动画。

我认为动画片段将在视图控制器更改发生之前实现,因为它是代码中的第一个。

代码做的一切都很好,它只是向后做。有人知道出了什么问题吗?

- (IBAction)next:(UIButton *)sender 

    clouds.animationImages = [NSArray arrayWithObjects:
                              [UIImage imageNamed:@"cloudAnim.0001.png"],
                              [UIImage imageNamed:@"cloudAnim.0002.png"],
                              [UIImage imageNamed:@"cloudAnim.0003.png"],
                              [UIImage imageNamed:@"cloudAnim.0004.png"],
                              [UIImage imageNamed:@"cloudAnim.0005.png"],
                              [UIImage imageNamed:@"cloudAnim.0006.png"],
                              [UIImage imageNamed:@"cloudAnim.0007.png"],
                              [UIImage imageNamed:@"cloudAnim.0008.png"],
                              [UIImage imageNamed:@"cloudAnim.0009.png"],
                              [UIImage imageNamed:@"cloudAnim.0010.png"],
                              [UIImage imageNamed:@"cloudAnim.0011.png"],
                              [UIImage imageNamed:@"cloudAnim.0012.png"],
                              [UIImage imageNamed:@"cloudAnim.0013.png"],
                              [UIImage imageNamed:@"cloudAnim.0014.png"],
                              [UIImage imageNamed:@"cloudAnim.0015.png"],
                              [UIImage imageNamed:@"cloudAnim.0016.png"],
                              [UIImage imageNamed:@"cloudAnim.0017.png"],
                              [UIImage imageNamed:@"cloudAnim.0018.png"],
                              [UIImage imageNamed:@"cloudAnim.0019.png"],
                              [UIImage imageNamed:@"cloudAnim.0020.png"],
                              [UIImage imageNamed:@"cloudAnim.0021.png"],
                              [UIImage imageNamed:@"cloudAnim.0022.png"],
                              [UIImage imageNamed:@"cloudAnim.0023.png"],
                              [UIImage imageNamed:@"cloudAnim.0024.png"],
                              [UIImage imageNamed:@"cloudAnim.0025.png"],
                              [UIImage imageNamed:@"cloudAnim.0026.png"],
                              [UIImage imageNamed:@"cloudAnim.0027.png"],
                              [UIImage imageNamed:@"cloudAnim.0028.png"],
                              [UIImage imageNamed:@"cloudAnim.0029.png"],
                              [UIImage imageNamed:@"cloudAnim.0030.png"],
                              [UIImage imageNamed:@"cloudAnim.0031.png"],
                              [UIImage imageNamed:@"cloudAnim.0032.png"],
                              [UIImage imageNamed:@"cloudAnim.0033.png"],
                              [UIImage imageNamed:@"cloudAnim.0034.png"],
                              [UIImage imageNamed:@"cloudAnim.0035.png"],
                              [UIImage imageNamed:@"cloudAnim.0036.png"],
                              [UIImage imageNamed:@"cloudAnim.0037.png"],
                              [UIImage imageNamed:@"cloudAnim.0038.png"],
                              [UIImage imageNamed:@"cloudAnim.0039.png"],
                              [UIImage imageNamed:@"cloudAnim.0040.png"],
                              [UIImage imageNamed:@"cloudAnim.0041.png"],
                              [UIImage imageNamed:@"cloudAnim.0042.png"],
                              [UIImage imageNamed:@"cloudAnim.0043.png"],
                              [UIImage imageNamed:@"cloudAnim.0044.png"],
                              [UIImage imageNamed:@"cloudAnim.0045.png"],
                              [UIImage imageNamed:@"cloudAnim.0046.png"],
                              [UIImage imageNamed:@"cloudAnim.0047.png"],
                              [UIImage imageNamed:@"cloudAnim.0048.png"], nil];
    [clouds setAnimationRepeatCount:1];
    clouds.animationDuration = 2.0;
    [clouds startAnimating];

    if (currentPage == 1)
        self.page02ViewController = [self.storyboard instantiateViewControllerWithIdentifier:@"page02"];
        [self.view insertSubview:_page02ViewController.view atIndex:0];
        [self.page01ViewController.view removeFromSuperview];
    

    if (currentPage == 2)
        self.page03ViewController = [self.storyboard instantiateViewControllerWithIdentifier:@"page03"];
        [self.page02ViewController.view removeFromSuperview];
        [self.view insertSubview:_page03ViewController.view atIndex:0];
    

    currentPage = currentPage +1;
    if (currentPage >3)
        currentPage = 3;
    

【问题讨论】:

【参考方案1】:

动画是异步的,这意味着下面的代码将立即执行。

如果您想等到动画的一个循环完成,您需要在之后延迟代码。最简单的方法是使用dispatch_after

dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 2.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^
    // Your view controller switching code will be executed after 2 seconds...
);

请注意,由于该方法会立即返回,因此没有什么可以阻止用户再次点击按钮并排队等待另一个转换。您可能希望在过渡期间禁用用户交互,但如果用户必须经常切换,那么 2 秒的过渡对用户来说就像是永恒的。

【讨论】:

啊,有道理。感谢您的意见,jrturton,我会开始测试这个! 回答我的问题如何奖励你? 乐谱下面应该有一个勾号,它是灰色的——点击它会变成绿色。如果您愿意,您还可以使用分数上方的向上箭头对答案进行投票。很高兴我能帮上忙!

以上是关于动画未按照编写代码的顺序运行的主要内容,如果未能解决你的问题,请参考以下文章

错误记录Kotlin 代码运行时报错 ( 成员属性初始化顺序是按照从上到下顺序进行的 , 上面的属性不要调用下面未进行初始化的属性 )

返回promises的Javascript顺序函数

c语言程序:输入人名和电话号码然后按照人名字母表顺序对通讯录排序,代码如下输入内容后回车无法运行?

动画未在 Jupyter 笔记本中运行

html引入的js文件,和直接在页面下写的js代码运行的顺序

Swift UI 动画 360 度旋转