可重用的TableViewCell异步高度

时间:2017-06-21 13:13:46

标签: ios swift uitableview swift3 swift2

我有自定义UITableViewCell:

enter image description here

还有一些带有imageURL属性的对象(从服务器获取)。

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

  • 当图像开始下载(在后台)时,用户也可以滚动tableView,如果图像未下载(图像== nil),则在scrollView中隐藏(需要隐藏/显示)和contentSize更改。 - 问题第一(滚动跳转)

  • SECOND:当用户滚动填充tableView时,某些单元格没有图像,当重复使用此单元格时,Kingfisher还尝试下载图像以供重复使用的单元格。如果图像存在 - imageView显示,细胞就像展开一样。 再次,scrollview contentSize发生了变化,结果我们发生了毛刺跳跃。

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

有想法(不仅仅是理论)吗?

由于

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

不是很好的解决方案,但有效。

enter image description here

1 个答案:

答案 0 :(得分: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
}