UITableView滞后于大图像

时间:2013-06-19 22:32:44

标签: ios objective-c uitableview

我面临的问题是垂直添加一堆图像并使整个事物可滚动。图像是768x768。我正在使用UITableView。

首先,我尝试通过以下方法将单个单元格出列来实现:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

由于我的设备只能垂直放置一个半这样的图像 - 每次要加载新图像时都会出现延迟。

所以......我想我只是通过在应用程序加载时缓存数组中的所有单元格来测试事物。所以现在我的检索单元格的方法如下:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{
    PhotoItemCellController *cell = [imgs objectAtIndex:[indexPath row]];
    return cell;
}

这是奇怪的事情:所有这些都与在需要时动态加载图像相同 - 仍然存在相同的延迟......但是...当我滚动整个表格到它的结尾时 - 表格开始完美地工作(显然会出现某种缓存)。

  • 为什么会这样?
  • 可能是因为我正在使用一组单元格而不是从表中“出列”它们?
  • 可能是因为单元格包含UIImageView吗?也许它第一次出现时会有所作为。

另外,当我滚动表格时,我注意到RAM使用量的增加,当我在应用程序启动时将所有单元格及其图像加载到内存中时,几乎没有消耗。

赞赏任何想法

2 个答案:

答案 0 :(得分:1)

UIImage支持某种能够延迟加载的智能缓存。在需要之前,图像文件很可能不会被加载到内存中。在为图像创建OpenGL纹理时也会有一些延迟(UIKit在幕后执行此操作,因为它使用OpenGL进行渲染)。如果你只想要平滑滚动,你可以在前台显示一个微调器,并创建一系列UIImageViews,你可以在UITableView后面逐个显示(你可以保留UIImageViews来生成你的单元格)。这样,在用户开始滚动之前,您将在纹理中的OpenGL上下文中缓存和(希望)所有数据。

答案 1 :(得分:0)

我强烈建议观看2010年& 2012 WWDC视频Designing Apps with Scroll ViewsEnhancing User Experience with Scroll Views解决您的问题。虽然第一个视频提供了传统的手动方法,但第二个视频已经更新了iOS6方法,通过使用UIPageViewControllers大大简化了代码。有一些非常好的谈论要点,就是当它们不是直接在视野中时将图像从内存中删除,以及在需要它们时构建图像。