带有很多图像的iphone桌面

问题描述:

我有一个UITableView,它在单元格中显示大量图像,我对于滚动性能并不放弃。我的UITableView就像iphone上的照片应用程序。有谁知道为什么iphone foto应用程序快速滚动,就好像它们在屏幕上没有任何东西。带有很多图像的iphone桌面

有没有人有一些提示/技巧来提高我的性能/滚动速度?

你应该precache你的图像,而不是懒洋洋地做。当你滚动你的桌子时,UITableViewDataSource:cellForRowAtIndexPath:方法被调用,如果你在那里加载你的图像,那么你会看到它请求你的单元格内容作为你的滚动,在你的应用程序中创建延迟。尝试将让你的cellForRowAtIndexPath:是这样的:

NSDate *date = [NSDate date]; 
... your cell loading code ... 
NSLog(@"Elapsed time to generate cell %.2d", [date timeIntervalSinceNow]); 

你会看到你花多长时间让每个细胞。

为了解决这个问题,你可以像你需要的那样复杂 - 如果你有一个很多的图像,你将不得不变得更加聪明。你可以做分页加载,在那里你跟踪最后一个单元格请求的NSIndexPath,并确定滚动是上升还是下降,并使用+NSImage:imageNamed:立即获取一些页面值的图像(即5个图像在你当前位置的前方),或者任何适合你的东西(利用人们必须将手指放回桌子底部再次滑动的事实,因此桌面元素的消耗已经暂停 - 您可以使页面大小足够大填充滑动)。不过,这可能仍然不是很好,因为你会立刻受到你所有的影响,而不是每个细胞的负担。

您可以快速将控制权返回给用户界面,并允许系统使用NSImage:imageNamed :,使用NSRunLoop:performSelector:target:argument:order:mode:关闭主循环中的预取图像页面,它将可用于显示。

虽然你需要痛苦地意识到内存问题。如果您发现这是一个问题,请使用NSImage:initWithContentsOfFile:,这将在内存不足的情况下清理图像缓存。根据高速缓存失效算法使用的策略,这些情况可能会在清除高速缓存时导致“口吃”,并且必须重新加载无效的预取。

+0

我不必使用丹尼尔建议的scrollview?他们有区别吗? – Ton 2009-08-08 09:53:23

+0

没有 - 事实上丹尼尔斯的评论有点奇怪,因为我对照片应用程序的看法是在整个屏幕上加载整个网格,四个宽。这很难 - 但他们正在做的是保留缩略图并使用它们。如果你快速滑动一下,它仍然不是完全平滑的。表格实际上更容易,因为它让你知道何时需要获得更多图像。 – groundhog 2009-08-08 14:27:59

+0

谢谢你的解释! – Ton 2009-08-08 20:46:39

通过对UITableViewCell进行子类化并直接绘制每个单元格的内容,已经报告了很好的滚动性能结果。有关更多详细信息和代码示例的链接,请参阅this question的接受答案。

+0

您链接到的博客中的讨论不适合这个问题 - 它谈论的是在iphone中合成性能,并建议您通过实现自己的绘图代码来使用完全不透明度来照顾这一点。这个问题可能没有受到这个问题的困扰。通常情况下,除非你有充足的理由,否则你不应该扩大细胞本身!添加contentView并设置backgroundView以便正确处理表格动画会更好。 – groundhog 2009-08-08 02:48:35

这里的问题是内存,你一次加载太多高分辨率的图片,照片应用程序不使用tableview它使用滚动视图,它一次只加载最多3张图片,所以内存是不是一个问题,如果你正在尝试做类似的照片应用程序使用滚动视图