性能在iPad上浏览多个全屏图像

时间:2011-09-07 01:50:51

标签: performance ipad uiimageview uiimage

我需要让用户通过点击来回溯导航不同的图像(从10到20) 所有图像都是1024x768 JPG,所以我不需要调整大小或转换它们 它们之间没有动画(我将使用removeFromSuperView和addSubView切换它们。)
我想要的只是避免加载时间或无响应的触摸,所以我实际上正在考虑这些可能的解决方案:

  1. 点击加载每张图片;
  2. 加载3张图片:上一张,另一张;下一张;
  3. 使用所有图像加载数组或uiviewimage并迭代它;
  4. 我将避免使用imageNamed,我将使用imageWithContentOfFile或imageWithData。
    您认为哪种解决方案最好? 解决方案1.和3.能带来一些性能问题吗?

3 个答案:

答案 0 :(得分:1)

方法1会很好:iOS设备可以非常快速地加载全屏图像。特别是如果你的图像没有alpha。这将取决于图像,但经典png需要大约0.05秒。这意味着如果您在点击后必须更改,用户将不会注意等待时间,尤其是如果图像之间有淡入淡出过渡。

如果用户可以滚动图像,事情就会变得更难。在这种情况下,我建议使用UITableView。它们的行为类似于UISCrollView,它们可以快速,平稳地加载/卸载页面。

要获得水平表格视图,您可以使用完美运行的代码:https://github.com/alekseyn/EasyTableView

答案 1 :(得分:0)

如果图像数量的上限是20,只需预加载一个UIImages数组,并在响应触摸时设置UIImageView.image属性 - 不用担心交换视图,重用单个UIImageView就可以了。

我不担心性能,除非上限上升得更高 - 如果确实如此,像选项2这样的动态缓存将是更好的选择,但更多的编程。

如果您担心应用程序商店的iPad应用程序的性能,请始终记得在第一代iPad上进行测试,因为在原始版本之后出现了重大的性能跳跃。

答案 2 :(得分:0)

我之前实际上已经这样做了。对于大图像,您将不得不小心记忆。我最初将所有图像加载到NSArray中,但我遇到了内存警告和崩溃。

我的实现使用带分页的UIScrollView。我有数组,一个包含所有的图像名称,另一个是可变的,只包含一些UIImageViews。我记录滚动视图所在的当前“页面”,当我登陆图像时,我确保可变数组包含该图像,并在其两侧包含两个图像(并从阵列中删除任何其他图像)。 / p>

这个实现的问题是你不得不从磁盘读取图像,这在主线程上会很慢。 Sooo当我最初创建UIImageViews时,我向它们添加了一个UIActivityIndi​​cator。然后,我将我的UIImageViews数组传递给后台中实际加载UIImage的方法,然后使相应的UIImageView在主线程上设置图像,如下所示:

// called before you try to load an image in a background thread
    [imageView addObserver:self forKeyPath:@"image" options:NSKeyValueObservingOptionNew|NSKeyValueObservingOptionOld context:nil];

// called in the background thread after you load the image from disk
    [imageView performSelectorOnMainThread:@selector(setImage:) withObject:fullImage waitUntilDone:NO];`


    - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context {
        UIImageView *imageView = (UIImageView *)object;
        [[imageView viewWithTag:1] removeFromSuperview]; // this is the activity indicator
        [imageView removeObserver:self forKeyPath:@"image"];
    }