整个应用程序单一动画UIImageView背景

时间:2013-01-01 16:56:02

标签: iphone ios ios6

我一直在阅读我在这里可以找到关于这个主题的所有内容,但我仍然不确定最好的方法。我有一个沉重的UIImageView,它使用一个胖UIImages数组作为动画循环。此UIImageView用作应用中每个屏幕的背景。 (客户的要求,不是我的,所以不要讨厌。)我们已经尽可能小地优化了png文件,但它仍然是一个非常重的负载。

我已经阅读了几篇关于UIImage如何在缓存中搜索该名称的现有图像(例如Shared UIImageView for background image throughout app - Singleton Property)的帖子,但这似乎没有发生。我也一直在这里阅读关于单身人士并在appdelegate中实例化但我不确定这些是否是正确的方法。

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

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

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

1 个答案:

答案 0 :(得分:2)

我对自己很满意。我选择了AppDelegate技术并且工作得非常好。我在AppDelegate中声明了一个UIImageView属性,然后将图像代码添加到其getter:

- (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应该缓存整个事情并加快加载时间。但似乎每时每刻的图像都必须重新加载 - 内存问题?因此,这允许我通过实例化对象一次并使用相同的对象来更多地控制它,同时还要将该对象设置为nil以在需要时释放内存。

自添加以来,整个应用程序的加载速度更快。我添加了一个额外的加载屏幕,其中包含一个活动指示器,用于初始加载(也可以很好地工作),之后的所有内容都很快乐。