0

在我的应用程序中有260个.jpg文件尺寸为 640*1136 的图像的动画。我将所有图像加载到数组中,如下所示。

点击按钮

- (void)singButtonClick:(id)sender
{
    [self initSingArray];
    [self startAnimationWithImages:singArray duration:2];
}

它将分配初始化我的数组,并从资源文件夹中加载所有 260 张图像

self.imageArray = [[NSBundle mainBundle] pathsForResourcesOfType:@"jpg" inDirectory:nil];


- (void)initSingArray
{
    if (!singArray)
    {
        singArray=[[NSMutableArray alloc] init];

        for(NSString *str in self.imageArray)
        {
            if([[str lastPathComponent] hasPrefix:@"Sing_"])
            {
                [singArray addObject:[UIImage imageNamed:[str lastPathComponent]]];
            }
        }
    }
}

对于图像动画,只需使用该数组并将其传递给 UIImageView

- (void)startAnimationWithImages:(NSMutableArray*)images duration:(NSTimeInterval)duration
{
    [self startAnimationWithImages:images duration:duration repeatCount:1];
}

- (void)startAnimationWithImages:(NSMutableArray*)images duration:(NSTimeInterval)duration repeatCount:(int)repeatCount
{
    if (self.gifImageView.isAnimating) 
    {
        [self.gifImageView stopAnimating];
    }

    self.gifImageView.animationImages = nil;
    self.gifImageView.animationImages = images;          // Animated image array
    self.gifImageView.animationDuration = duration;      // Perform a full animation when
    self.gifImageView.animationRepeatCount = repeatCount;// Animation number of repetitions
    [self.gifImageView startAnimating];
}

但是当第一次点击按钮时,动画需要很长时间。当图像数量较少时它会正常工作。

图像的尺寸会产生问题吗?

请帮我解决它。

注意:我发现许多与此问题相关的帖子,但没有一个可以帮助我解决此问题。

4

3 回答 3

0

您必须[self initSingArray];viewDidLoad或其他地方执行此操作,而不是单击按钮。它会解决你的问题。您的情况的原因是第一次创建图像数组,因此需要时间。

于 2013-06-11T10:20:45.000 回答
0

在imageview-animation-getting-more-memory上查看我对同一类问题的回答。底线是你永远不会让你的应用程序使用 animationImages 方法和很多像你一样的图像工作。您最好使用已经处理内存问题的现有解决方案,并提供一种避免在动画开始显示之前将所有图像数据解码到内存中的方法(这就是开始动画如此缓慢的原因)。

于 2013-07-01T08:50:04.077 回答
0

经过大量的研发后,最后我通过一些 grate 博客文章解决了这个问题。我的应用程序成功运行,没有崩溃问题并且响应速度很快。

而不是使用UIImageView进行动画制作试试这个炉排教程Memory_usage_on_ios

简化的PNG动画示例代码

希望这个答案能帮助人们在没有内存泄漏问题的情况下为大量图像帧设置动画。

于 2013-07-24T10:31:22.800 回答