2017-06-21 39 views
2

我有自定义的UITableViewCell:可重复使用的TableViewCell异步高度

enter image description here

也有一定的对象(从服务器获得)与ImageUrl属性。

任务:需要异步下载图片(通过翠鸟)。如果图像不存在 - 隐藏ImageView。 一些工作正常,但:

  • 当图像开始下载(背景),用户也可以滚动的tableView,如果图像不能下载(图片==无),ImageView的隐藏(需要隐藏/显示)和scrollView中的contentSize已更改。 - 问题第一(滚动跳转)

  • 第二:当用户滚动填充tableView,一些单元格没有图像,并且当这个单元格被重用时,Kingfisher也尝试下载图像以重用单元格。如果图像存在 - imageView显示,像单元格一样展开。 再次scrollview contentSize改变,结果我们有毛刺跳转。

P.S.尝试使用表更新,重新加载行,也使用不同的单元格为空单元格 - 不成功。也试图找到解决的SO,但只资助理论:)

有想法(不仅是理论)?

谢谢

P.S.S.基于图像的硬编码单元尺寸(有或没有)。还要更改约束imageView(0或xxx)。如果理解正确的 - 的tableView不知道细胞的大小(因为设置UITableViewAutomaticDimension)

不是很好的解决方案,但作品。

enter image description here

回答

0

对于你的第一个问题,有两种方法可以解决这个问题。你可以有一个超快速的服务器,或者在arrayOfObjects中预载图像高度。也就是说,当你得到你的对象列表时,你还要检查是否有图像。所以当你加载单元格时,你不需要等待下载,然后显示/隐藏图像。这样做不仅可以使滚动更好,还可以减少对图像服务器的调用。

关于第二个问题,有一个标志在对象从数组,指示如果对象具有图像或没有。如果它没有映像,请停止再次从服务器下载。示例代码将如下所示:

//itemObject now has property called loadFlag which set to true by default 

if itemObject.loadFlag { 
    //Your loading image code . If image is nil, set this flag to false 
} else { //This will prevent reused cell having image by default 
    cell.pictureView.isHidden = true 
    cell.picture = nil 
} 
+0

loadFlag - 不起作用。问题不在“旗”(也试过这个)。问题如果(例如)你有没有图像的第一个单元(这个单元很小)。向上滚动,当tableView中的单元格出现时 - 与下一个对象(在数组中的队列中)重用。但这个对象有图像(说存储在“标志”)。当tableView将此图像设置为重用单元格时,单元格会展开,并且scrollView将具有跳跃伪影,因为scrollViewContentSize将保持更大。 –

+0

@SergeyKrasiuk正如我在第一个问题中所说的,除非你得到你的arrayOfObjects图像信息,否则你不可能阻止单元格的大小调整,你可以通过某种方式知道是否存在图像。由于此下载是延迟加载,因此单元格高度总是会有时间延迟,并且除非在下载之前知道是否存在图像,并且在下载之前设置大小,否则总会存在调整大小的事情 –

+0

基于图像的硬编码单元大小(有或没有) - 工作良好 –