我正在尝试为我的iOS应用创建一个介绍动画,并且我遇到了计时问题。特别是我想在介绍动画播放后更改屏幕。我目前使用UIImageView,似乎没有办法做到这一点。许多stackoverflow问题说使用NSTimer或performSelector:afterDelay但这些不是准确的计时器,在我的情况下是完全错误的。这就是我在做的事情。
如果我执行步骤5或6,则无法正常工作。它确实正确播放动画,它将正确地改变视图/视图控制器,但时间错误可怕。当您以这种方式调用startAnimating时,实际上可能无法启动动画一整秒或两秒。我推测,因为应用程序仍然以某种方式加载资源。然而,这次在模拟器或所有设备上并不一致。事实上,同一设备上的多次运行可能会有不同的结果。因此,我无法对某些延迟进行硬编码。
我想做的就是检测到UIImageView动画播放了最后一帧并做了些什么。而已。到目前为止,我发现的最佳解决方案是以某种方式设置计时器然后执行某些操作,但在我的情况下,计时器不是解决方案。
有什么想法吗?
答案 0 :(得分:1)
您观察到的长时间延迟是由于图像的读取和解码,UIImageView
在动画开始之前进行的。
Core Animation为您执行动画,并在渲染服务器中进行绘制,渲染服务器位于单独的进程中。请记住,您在屏幕上看到的内容并不一定代表您应用的图层树的即时图片:Core Animation Rendering Architecture。
UIImageView
不提供在此处为您提供准确结果的工具。我建议:
UIView
。CAKeyframeAnimation
,并将图片“CGImageRefs
作为其值。IntroViewController
。IntroViewController
将获得animationDidStop:已完成:完成后。但要考虑两件事:
首先,使用电影而不是一系列图像可以获得更好的效果,因为电影可以从存储中流式传输。
其次,更重要的是,这种解决方案将改善时间安排,但不会完全缓解它。当您的应用认为动画已完成时,系统会调用animationDidStop:finished:
...这不一定就在它看起来完成时。
如果您不依赖代表回调进行媒体播放,您会做得更好:相反,添加此动画和转换视图的动画(必要时使用CAAnimationGroup
)在运行循环的同一圈。使用第一个动画持续时间的beginTime
延迟后者。根据您正在做的事情,您可能还必须设置第二个动画的填充模式,以便在第一个动画期间获得正确的行为。