调用多个动画,一个接一个相同的UIView对象,不使用补全

Posted

技术标签:

【中文标题】调用多个动画,一个接一个相同的UIView对象,不使用补全【英文标题】:Call multiple animation, one after another one same UIView object, without using completion 【发布时间】:2014-06-17 09:30:54 【问题描述】:

UPATE 开始

正确答案在这里:Is it posible to do multiple animations on UIView without using completion block

无需阅读。

UPATE结束

我有与UIView animateWithDuration returns immediately 类似的问题,但我不能使用完成块,因为我的动画在不同的功能中。

但确实想为同一个对象设置动画。

我正在制作纸牌游戏,所以我在屏幕上移动纸牌,但在移动之间我也有一些游戏逻辑。这就是为什么我可以方便地单独制作动画。

如何解决这个问题?

@Fogmeister 完成问题如下: 在method1之后,method2被调用。 如果我想调用method1 52次(因为我有52张卡),那么method2也会被调用52次。 但在我的场景中,我需要调用 method1 52 次,而不是调用 method2 4 次... 所以我看不出这会因竞争而下降。 有时我需要在method1之后调用method2,但有时我需要在method1之后调用method3...

我正在考虑在方法 1 之后对对象进行深层复制,然后在新对象上调用方法 2。 这行得通吗?

@Fogmeister 第二次回复 我也得出了同样的结论。 但由于以下原因,我不喜欢它。 我需要将游戏逻辑放在动画逻辑中,并且我希望事情是松散耦合的。 动画代码不应处理游戏逻辑代码。

我想做的是做多个动画,一个接一个的同一个UIView对象,不使用completion:,因为我不会保持动画代码简单并重用它。

如果你愿意,可以从http://weborcode.com/dl/Tablic.zip下载我的代码 动画在 TBL_CardView.m 文件方法动画中完成* 它是从以下位置调用的: TBL_GameViewController.m 文件方法 gameStateMachineLoop 所有卡片从左到右洗牌,然后一张卡片再次发送到左边。 但问题是那张牌在洗牌前就已经在右边了, 如果你启动这个项目,你就会成功。

【问题讨论】:

那就解耦吧!严重地?我不是为你写你的代码。我正在建议绕过它的方法。是什么阻止您调用游戏逻辑类上的方法来确定接下来要调用哪个方法?我在其中放了一个 if 块,向您展示您可以将实际代码放在那里。如果不是一成不变的。您可以选择许多不同的解决方案。你现在应该可以做到了。 【参考方案1】:

没有太多的信息可以继续,但您不必为每个动画制作一个动画。如果您想为所有卡片制作动画,请使用单个动画并更新 animations 块中的所有卡片。

如果您想对所有卡片进行动画处理,然后再进行其他操作,则可以执行以下操作...

- (void)animateCards:(NSArray *)cards

    // call this once and all of the cards in the array will animate over 5 seconds.
    [UIView animateWithDuration:5.0
                     animations:^
                         for (Card *card in cards) 
                             card.frame = // whatever
                         
                     
                     completion:^(BOOL finished) 
                         if (iNeedToCallMethod2) 
                             [self doSomethingElse];
                          else 
                             [self somethingCompletelyDifferent];
                         
                     ];


- (void)doSomethingElse

    //this will only run after all the cards have animated
    //if the condition requires it to run

    [UIView animateWithDuration:5.0
                     animations:^
                         for (Suit *suit in self.suits) 
                             // not really sure what you want to do here
                             // but you can do the same as above
                         
                     
                     completion:^(BOOL finished) 
                     ];


- (void)somethingCompletelyDifferent

    //this will run once only if the other method doesn't run

您所做的只是控制流量。不要再想着在桌子周围移动卡片,而要多想想你有哪些可用的工具,以及如何使用它们来做你想做的事情。

【讨论】:

我添加了对问题的回复 @WebOrCode 伙计,你现在显然已经足够了。你所需要的只是弄清楚需要发生的事情的流程,然后让它发生。如果您想将单张卡片移过来,请将其移过来。我真的不明白这里有什么问题。你是开发者,所以开发。不要依赖其他人将代码放在盘子上! 是的,我是开发人员。这就是为什么我不想编写将来难以处理的糟糕的 spageti 代码。我不是要你给我写代码,我已经放了我的源代码,喜欢的可以看看。 您仍然可以将逻辑与动画分开。我在网络浏览器中回答。这不是开始创建类等的理想场所...我已经向您展示了如何将动画代码与完成块一起使用的构建块。现在由您来使用它并构建您想要的代码。 没关系,我看你不明白我的意思。重点是我没有使用完成块,因为我遇到了动画需要处理游戏逻辑的问题,我想避免这种情况。这就是重点。

以上是关于调用多个动画,一个接一个相同的UIView对象,不使用补全的主要内容,如果未能解决你的问题,请参考以下文章

使用 Swift 在单个 UIView 上同时进行多个动画

UIView动画

如何在代码中调用 UIView 动画

动画中断时未调用 UIView 动画完成块

iOS 10 UILabels -> 1 UIView -> 循环动画

单个 UIView 上的多个同时 UIViewAnimations