【问题标题】:iOS Animating a series of imagesiOS 动画一系列图像
【发布时间】:2014-06-06 23:36:06
【问题描述】:

我有一个 iOS 应用程序,它将一组图像和一个持续时间加载到一个数组中,然后我有一个显示图像的计时器,如下所示:

- (void)fireTimer:(NSTimer *)theTimer
{
    self.image = [frames objectAtIndex:currentFrame];
    NSTimeInterval time = [[durations objectAtIndex:currentFrame] floatValue];
    self.timer = [NSTimer scheduledTimerWithTimeInterval:time target:self selector:@selector(fireTimer:) userInfo:nil repeats:NO];
    currentFrame++;
    if (currentFrame >= [frames count])
    {
        currentFrame = 0;
        [timer invalidate];
    }
}

要启动动画,我调用 fireTimer 并循环显示图像,然后在处理完所有图像后调用 [timer invalidate] 来停止动画。我不能使用 startAnimation,因为我需要为每张图片设置不同的持续时间。

知道我没有在后台线程上执行此操作,因此动画不稳定,因为在图像动画时正在进行其他处理。

在背景中制作动画的最佳方式是什么?我可以简单地将这个对 fireTimer 的调用放在一个块中吗?

我知道这可能不是在 iOS 上为图像制作动画的最佳方式,但我现在不想对代码进行大量重构。

感谢您提供任何建议或示例以获得更好的解决方案!!!

【问题讨论】:

  • 完全取消计时器。这是一种非常粗糙的动画机制,几乎不应该使用。相反,从查看 UIImageView 及其动画 API 开始。
  • 大卫,感谢您的建议。我找到了其他制作动画的方法,但它们需要比我们现在想要做的更多的代码更改。我完全同意你的观点,它很粗糙,但在写它的时候已经足够了。
  • 计时器是唯一的方法,因为您声明每个帧需要显示不同的时间。您必须注意避免分配整个 UIImage 对象数组,因为这会在消耗完所有系统内存后使您的设备崩溃。

标签: ios objective-c animation nstimer


【解决方案1】:

我建议您使用 UIImageView 来为您的图像设置动画:它是用来完成这项任务的。如果,如您所说,某些图像需要比其他图像保留更长的时间,那么您可以多次显示它们。假设 image2 需要比 image1 和 image3 显示两倍长,只需在 UIImageView 上初始化数组 animationImages,例如:@[image1, image2, image2, image3]

【讨论】:

  • 大声笑,简单,我没有想到,但是,它们不一定是两倍长,但我想我可以找到一个最小的、共同的值就足够了。我会看看是否有任何其他建议,如果没有,那么我将修改我的数组并尝试它。感谢您的建议。
  • 请记住,这种使用动画图像的建议方法会在内存不足时使您的设备崩溃。使用计时器并在加载之前解析每一帧是更好的方法。
【解决方案2】:

您可以使用performSelector: withObject: afterDelay:,而不是使用计时器

-(void)loopBackground:(int)index
{
    if(index < [self.durations count]{
        self.image = [self.frames objectAtIndex:index];
        [self performSelector:@selector(loopBackground:) withObject:index++ afterDelay:[[self.durations objectAtIndex:index] floatValue]];
    }
}

【讨论】: