ios - 如何强制动画在循环中顺序执行?

时间:2013-11-12 07:04:27

标签: ios iphone objective-c animation uiimageview

我有一个各种操作的优先级队列--UIImageView转换和与它们相关的HP栏减少。我已经使用CALayer动画编写了一个条形小部件,所以它应该处理自己,但由于某种原因,即使我的循环是顺序的,所有动画 - 条形动画以及队列中的其他动作 - 都同时发生。我如何强制顺序?这是我的viewController .m:

中的代码
while (![selectedMoves isEmpty])
    {
        SelectedMove* nextMove = [selectedMoves dequeueMax];

        // Move the user to clearly indicate who is moving:
        [self animateAttacker:nextMove.user];


        [moveReporter setText:report];
        [self executeMove:nextMove];
    }

executeMove是更改运行状况栏值以反映损坏的包装器。

-(void) executeMove:(SelectedMove*)attack
{
   ... calculate damage dealt by attack...

   // Animate HP bar change on-screen
    double percentage = (double)[currentHP intValue] / (double)[currentStats[HP] intValue];
    [playerHealthBars[slot] updateBarPercentage:percentage andMaxHP:[currentStats[HP] intValue]];


}

我的问题是所有的healthBar动画以及“animateAttacker”调用都会立即在屏幕上发生。什么命令强制一个人在另一个之前执行,或者在继续之前强制屏幕刷新?

animateAttacker是根据nextMove转换适当的UIImage的包装器。 目标是让循环的每次迭代 - 健康栏和animateAttacker - 同时或顺序执行,并按循环的顺序执行单独的迭代: :

-(void)animateAttacker:(HonmonBattleState*)attacker 
{
        UIImageView* attackerImageView = playerImages[index];
        [UIView beginAnimations:nil context:NULL];
        [UIView setAnimationDuration:1.0];
        attackerImageView.transform=CGAffineTransformMakeTranslation(ATTACK_PERTURBATION, -ATTACK_PERTURBATION);
        [UIView commitAnimations];

        [UIView beginAnimations:nil context:NULL];
        [UIView setAnimationDuration:1.0];
        attackerImageView.transform=CGAffineTransformIdentity;
        [UIView commitAnimations];
   }

感谢您的帮助!

PS>我可以使用CALayer Core Animations或UIView动画。我已经完成了两项工作,健康栏在内部使用图层完成。

2 个答案:

答案 0 :(得分:1)

基于块的UIView动画具有可用于链接动画的完成块,请参阅this thread over here

您可以在CAAnimations中使用this category on GitHub的完成块(如果需要,可以在CocoaPods上使用)。

答案 1 :(得分:1)

如果您想要动画的全局串行队列,则应考虑拥有自己的NSOperationQueue,其最大并行任务数为1。这样,您在其上运行的所有操作都将被延迟,直到之前的操作完成。