UIImageView简介动画问题

时间:2011-01-12 17:40:00

标签: iphone ios animation uiimageview

我正在尝试为我的iOS应用创建一个介绍动画,并且我遇到了计时问题。特别是我想在介绍动画播放后更改屏幕。我目前使用UIImageView,似乎没有办法做到这一点。许多stackoverflow问题说使用NSTimer或performSelector:afterDelay但这些不是准确的计时器,在我的情况下是完全错误的。这就是我在做的事情。

  1. 将UILaunchImageFile设置为LaunchImage.png
  2. AppDelegate分配IntroViewController
  3. IntroViewController.LoadView分配IntroView
  4. IntroView.initWithFrame执行以下操作    UIImageView * iv =    iv.animationImages =    iv.animationDuration = 2.0    iv.animationRepeatCount = 1    [iv startAnimating]
  5. 设置NSTimer / performSelector:afterDelay?
  6. 当计时器触发器从IntroViewController更改为其他内容时。
  7. 如果我执行步骤5或6,则无法正常工作。它确实正确播放动画,它将正确地改变视图/视图控制器,但时间错误可怕。当您以这种方式调用startAnimating时,实际上可能无法启动动画一整秒或两秒。我推测,因为应用程序仍然以某种方式加载资源。然而,这次在模拟器或所有设备上并不一致。事实上,同一设备上的多次运行可能会有不同的结果。因此,我无法对某些延迟进行硬编码。

    我想做的就是检测到UIImageView动画播放了最后一帧并做了些什么。而已。到目前为止,我发现的最佳解决方案是以某种方式设置计时器然后执行某些操作,但在我的情况下,计时器不是解决方案。

    有什么想法吗?

1 个答案:

答案 0 :(得分:1)

您观察到的长时间延迟是由于图像的读取和解码,UIImageView在动画开始之前进行的。

Core Animation为您执行动画,并在渲染服务器中进行绘制,渲染服务器位于单独的进程中。请记住,您在屏幕上看到的内容并不一定代表您应用的图层树的即时图片:Core Animation Rendering Architecture

UIImageView不提供在此处为您提供准确结果的工具。我建议:

  1. 自己制作UIView
  2. 使用离散计算模式创建CAKeyframeAnimation,并将图片“CGImageRefs作为其值。
  3. 将动画的委托设置为IntroViewController
  4. 将动画添加到视图的“内容”键层。
  5. 您的IntroViewController将获得animationDidStop:已完成:完成后。
  6. 但要考虑两件事:

    首先,使用电影而不是一系列图像可以获得更好的效果,因为电影可以从存储中流式传输。

    其次,更重要的是,这种解决方案将改善时间安排,但不会完全缓解它。当您的应用认为动画已完成时,系统会调用animationDidStop:finished: ...这不一定就在它看起来完成时。

    如果您不依赖代表回调进行媒体播放,您会做得更好:相反,添加此动画和转换视图的动画(必要时使用CAAnimationGroup)在运行循环的同一圈。使用第一个动画持续时间的beginTime延迟后者。根据您正在做的事情,您可能还必须设置第二个动画的填充模式,以便在第一个动画期间获得正确的行为。