我有一个UITableView
在单元格中显示很多图像,我对滚动性能并不满意。我的UITableView
类似于iphone上的照片应用。有没有人知道为什么iphone的照片应用程序如此快速滚动,就好像它们在屏幕上没有任何东西一样。
是否有任何提示/技巧可以提高我的性能/滚动速度?
答案 0 :(得分:3)
你应该预先处理你的图像,而不是懒散地做。当您滚动表格时,会调用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:在主runloop上使用NSRunLoop:performSelector:target:argument:order:mode:来安排预取的图像页面,然后在请求单元格时使用在足够远的地方它将可以显示。
你需要痛苦地意识到记忆问题。如果您发现这是一个问题,请使用NSImage:initWithContentsOfFile:,这将在内存不足的情况下清理图像缓存。根据缓存失效算法使用的策略,这些情况可能会在您清除缓存时导致“口吃”,并且必须重新加载无效的预取。
答案 1 :(得分:0)
通过子类化UITableViewCell并直接绘制每个单元格的内容,已经报告了很好的滚动性能结果。有关详细信息和代码示例的链接,请参阅this question的已接受答案。
答案 2 :(得分:0)
这里的问题是内存,你一次加载太多的高分辨率图片,foto应用程序不使用tableview它使用滚动视图,它一次只加载3张图片,所以内存不是如果你想尝试做类似于foto app的东西,请使用滚动视图