我有一个UITableView
在单元格中显示很多图像的,我对滚动性能并不满意。我UITableView
的类似于 iphone 上的照片应用程序。有谁知道为什么 iphone foto 应用程序滚动得如此之快,就好像他们在屏幕上什么都没有一样。
有没有人有一些提示/技巧来提高我的性能/滚动速度?
我有一个UITableView
在单元格中显示很多图像的,我对滚动性能并不满意。我UITableView
的类似于 iphone 上的照片应用程序。有谁知道为什么 iphone foto 应用程序滚动得如此之快,就好像他们在屏幕上什么都没有一样。
有没有人有一些提示/技巧来提高我的性能/滚动速度?
你应该预先缓存你的图像,而不是懒惰地做。当您滚动表格时,会调用UITableViewDataSource:cellForRowAtIndexPath:方法,如果您在其中加载图像,那么您会看到它在滚动时请求您的单元格内容,从而在您的应用程序中产生延迟。尝试让你的 cellForRowAtIndexPath: 像这样:
NSDate *date = [NSDate date];
... your cell loading code ...
NSLog( @"Elapsed time to generate cell %.2d", [date timeIntervalSinceNow] );
你会看到你花了多长时间来获取每个单元格。
为了解决这个问题,你可以根据需要变得复杂——如果你有很多图像,你将不得不变得越来越聪明。您可以进行分页加载,在其中跟踪请求的最后一个单元格的 NSIndexPath,并确定滚动是向上还是向下并使用+NSImage:imageNamed:一次向前获取一些页面的图像(即,在您当前位置之前的 5 个图像),或者任何适合您的东西(利用人们必须将手指返回到表格底部才能滑动的事实再次,因此表格元素的消耗会暂停 - 您可以使页面大小足够大以填充滑动)。不过,这可能仍然不是很好,因为您只会同时承受所有的影响,而不是每个单元的紧张负载。
您可以快速将控制权返回给 UI,并允许系统使用NSRunLoop:performSelector:target:argument:order:mode:调度预取的图像页面,使用 NSImage:imageNamed: 关闭主运行循环,然后在请求单元格时,如果您已经取得了足够远的距离,它将可以显示。
但是,您需要痛苦地意识到内存问题。如果您发现这是一个问题,请使用NSImage:initWithContentsOfFile:,它将在内存不足的情况下清理图像缓存。根据缓存失效算法使用的策略,这些情况可能会在您清除缓存时导致“卡顿”并且必须重新加载失效的预取。
通过继承 UITableViewCell 并直接绘制每个单元格的内容,报告了出色的滚动性能结果。有关更多详细信息和代码示例的链接,请参阅此问题的已接受答案。
这里的问题是内存,您一次加载了太多高分辨率图片,foto 应用程序不使用 tableview 它使用滚动视图,并且一次最多只能加载 3 张图片,所以内存不是问题,如果您尝试做类似于 foto 应用程序的操作,请使用滚动视图