2012-06-29 34 views
2

我目前在我的应用程序中集成了Facebook,我目前正在加载登录用户的朋友的个人资料图片。我在UITableView中呈现这些用户,在每个单元中显示图片和朋友的名字。我已经子类化UIImageView,并且在cellForView方法中处理相应的单元格时,图像是异步加载的。在一个可用视图中加载异步图像

但是,当我多次上下滚动时,图像闪烁,首先加载一些错误的图片,显示很短的时间,然后加载右侧的图像。所以我认为我不得不寻找一种方法来阻止当单元格在视图之外时加载图像。

有没有人可以帮我解决这个问题并给我一个解决方案?

在此先感谢!

+0

你能分享一些你设置图像的代码吗?这样做比不重复使用单元更好! – hypercrypt

+0

嘿一个建议,你可以缓存这些图像,当你完成你的工作与这些图像清除缓存。 – Leena

回答

0

你可以考虑不重复使用单元格。但是,如果您需要加载很多表格单元格(例如,很多朋友),这可能会影响性能。由于每个单元都有自己的图像,因为单元重用将不会发生闪烁。

要看的另一件事是图像的文件大小。有可能它们比你实际展示的尺寸还要大。如果有办法获得更小的版本,那肯定也会有帮助。

第三,您可以将图像视图设置为tableView:willDisplayCell:forRowAtIndexPath中的默认图像。闪烁可能仍然会发生,但是使用默认图像时,看起来比其他人的图片更好。事实上,我认为这是Facebook应用的功能。

+0

谢谢你的回应。我现在通过不重复使用单元格来工作:) – Devos50

+3

你应该真正重用单元格! – hypercrypt

0

当单元格变为隐藏时,它将从tableView中删除。所以,你可以在
- (void)prepareForReuse method of UITableViewCellUITableViewCell派生类的方法willMoveToSuperview:

- (void)willMoveToSuperview:(UIView *)newSuperview 
{ 
    [super willMoveToSuperview:newSuperview]; 
    if(newSuperview == nil) { 
     // Stop image downloading 
    } 
} 
+0

谢谢你的回答。我试图实现这一点,但它并没有很好地工作,我有和以前一样的问题;) – Devos50

4

您可以关闭任何加载图像(以及正在进行的装载操作,如果有的话)覆盖。

我强烈建议重用单元格,如果没有它,就没有机会获得很好的平滑滚动。

+0

请更详细一些,我必须在prepareForReuse方法中做些什么? – Kasihasi

+1

您应该取消图像加载操作并清除图像视图(例如,为其指定null或某个占位符)。 在ios6中,您还可以使用tableView:didEndDisplayingCell:forRowAtIndexPath:方法。 – note173