暂停/恢复几十个动画的最佳方法是什么?

时间:2013-10-17 15:20:10

标签: c# animation uiviewcontroller xamarin.ios core-animation

假设我的应用程序同时运行了几十个动画,我想将它们全部暂停,就好像这是一个游戏而用户点击暂停按钮。最好的方法是什么?我正在使用CAKeyFrameAnimations,UIView.Animate(),CABasicAniamtions等的组合。显然,当用户暂停时,我可以手动停止它们,并在用户取消暂停时从它们停止的位置恢复它们。但是有没有这样做的更好方法是什么?


修改:我希望能够暂停&通过用户按下按钮恢复。


第二次编辑:我有90%的方式,但我仍然遇到问题......

这是我的Xamarin iOS项目: https://www.dropbox.com/s/5zbhhao6cijtb1i/Test_Pause.zip

有用的Apple参考: https://developer.apple.com/library/ios/qa/qa1673/_index.html

我有一个启动位置动画的应用程序。当我第一次暂停它时,它会正确暂停。当我点击简历时,它会从暂停的正确位置恢复正常。但是当你第二次再次点击暂停时(在相同的动画中),它会恢复到一个位置,好像它从未暂停开始一样。它在应有的位置之前暂停。当然,理想的结果是让它在你点击暂停按钮时完全停止。

很抱歉,如果这听起来令人困惑,我附加的示例项目非常简单,重现问题,从上面的链接下载我的应用程序。运行。确保在同一动画中再次暂停,恢复,然后再次暂停。知道我做错了吗?

3 个答案:

答案 0 :(得分:0)

你可以在绘图方法的开头使用布尔值,如果布尔值为真(意味着没有动画),那么它会直接到达结尾

答案 1 :(得分:0)

您可以使用CAAnimationGroup,它是CAAnimation的子类,并将其组件Animations作为一个组进行操作(我不确定它们是否严格 已同步,但我认为它们足够接近视觉目的。)

答案 2 :(得分:0)

我现在可以使用CAMediaTiming成功暂停和恢复动画,所有这些都无需停止aniamtion并更改持续时间并再次启动它。 See this useful resource

班级变量:

UIView MyImage;
double timeSincePause = 0;
double pauseTime = 0;

暂停功能:

MyImage.Layer.Speed = 0.0f;
MyImage.Layer.TimeOffset = MyImage.Layer.ConvertTimeFromLayer(CAAnimation.CurrentMediaTime(), MyImage.Layer) - timeSincePause;

恢复功能:

pauseTime = MyImage.Layer.TimeOffset;
MyImage.Layer.Speed = 1.0f;
MyImage.Layer.TimeOffset = 0.0f;
MyImage.Layer.BeginTime = 0.0f;
timeSincePause = (MyImage.Layer.ConvertTimeFromLayer(CAAnimation.CurrentMediaTime(), MyImage.Layer) - pauseTime);
MyImage.Layer.BeginTime = timeSincePause;