2013-01-01 19 views
3

我一直在阅读我在这里可以找到关于这个主题的一切,但我仍然不确定最佳的处理方式。我有一个沉重的UIImageView,它使用一组脂肪UIImages作为动画循环。这UIImageView作为应用程序中每个屏幕的背景。 (客户的请求,不是我的,所以不要讨厌。)我们已经尽可能小的优化了png文件,但它仍然是一个相当沉重的负载。单个动画UIImageView背景整个应用程序

我读过几篇关于UIImage如何在缓存中搜索该名称的现有图像(例如Shared UIImageView for background image throughout app - Singleton Property)的文章,但似乎没有发生。我也一直在这里读关于singletons和在appdelegate中实例化的东西,但我不确定这些是否是正确的方法。

在应用程序的整个生命周期中加载UIImageView并在每个viewcontroller的后台使用它的最佳方式是什么?顺便说一句,因为它需要几秒钟才能加载,我将在应用程序启动时添加一个“加载”页面,该页面使用单个静态图像和活动指示器。

另外,我不太熟悉测试和性能工具。我应该使用哪一个来测试性能,并确保这是导致整个应用程序犹豫的原因?

为noob问题事先道歉 - 我通常会避免提问,但有时候,因为在这种情况下,我甚至不知道从哪里开始研究。

回答

2

我对自己很满意。我使用了AppDelegate技术,它的工作非常漂亮。我宣布在AppDelegate中一个UIImageView属性,然后将图像代码添加到其吸气剂:

- (UIImageView *)backgroundImageView { 
    if (!_backgroundImageView) { 
     NSMutableArray *tempArray = [NSMutableArray arrayWithCapacity:150]; 
     for (int imageNum = 0; imageNum < 150; imageNum++) { 
      [tempArray addObject:[UIImage imageNamed:[NSString stringWithFormat:@"image_00%03i.png",imageNum]]]; 
     } 
     _backgroundImageView = [[UIImageView alloc] initWithImage:[UIImage animatedImageWithImages:tempArray duration:4.0]]; 
    } 
    return _backgroundImageView; 
} 

这也让我杀死applicationDidReceiveMemoryWarning的对象。

然后我创建了一个辅助类,我可以跳进我的所有的UIViewController类:

+ (void)placeBackgroundImageUnderView:(UIView *)masterView { 
    myAppDelegate *appDelegate = (myAppDelegate *)[[UIApplication sharedApplication] delegate]; 
    //Correct for shrinkage 
    appDelegate.backgroundImageView.frame = masterView.frame; 
    [masterView addSubview:appDelegate.backgroundImageView]; 
    [masterView sendSubviewToBack:appDelegate.backgroundImageView]; 
} 

这让我补充一条线在每个viewDidLoad方法:

[HelperClass placeBackgroundImageUnderView:self.view]; 

事情是,只使用UIImage应该缓存整个事情,并加快加载时间。但似乎时不时的图像将不得不重新加载 - 内存问题?因此,这允许我通过实例化对象一次并使用同一对象来控制它,同时也可以将该对象设置为零,以便在需要时释放内存。

由于添加它,整个应用程序加载速度更快。我添加了一个额外的负载屏幕,并为该初始负载提供了一个活动指示器(也可以很好地工作),并且之后的所有内容都很快乐。