我有一个各种操作的优先级队列--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动画。我已经完成了两项工作,健康栏在内部使用图层完成。
答案 0 :(得分:1)
基于块的UIView动画具有可用于链接动画的完成块,请参阅this thread over here。
您可以在CAAnimations中使用this category on GitHub的完成块(如果需要,可以在CocoaPods上使用)。
答案 1 :(得分:1)
如果您想要动画的全局串行队列,则应考虑拥有自己的NSOperationQueue
,其最大并行任务数为1。这样,您在其上运行的所有操作都将被延迟,直到之前的操作完成。