3

我面临的问题是垂直添加一堆图像,并使整个图像可滚动。图像为 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 使用量激增,并且当我在应用程序启动时将所有单元格及其图像加载到内存中时,几乎没有消耗。

任何想法表示赞赏

4

2 回答 2

1

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

于 2013-06-19T22:37:13.363 回答
0

我强烈建议您观看 2010 和 2012 WWDC 视频Designing Apps with Scroll ViewsEnhancing User Experience with Scroll Views,因为它们解决了您的问题。虽然第一个视频提供了传统的手动方法,但第二个视频更新了 iOS6 方法,通过使用 UIPageViewControllers 大大简化了代码。有一些很好的谈话要点,关于当图像不直接在视图中时从内存中杀死图像,以及在需要它们时构建图像。

于 2013-06-19T23:26:58.303 回答