可重复使用的 TableViewCell 异步高度
Reusable TableViewCell asynchronous height
我有自定义的 UITableViewCell:
还有一些对象(从服务器获取)带有 imageURL 属性。
任务:需要异步下载图片(通过 Kingfisher)。如果图像不存在 - 隐藏 ImageView。
有些工作正常,但是:
当图片开始下载时(在后台),用户也可以滚动tableView,如果图片没有下载(image == nil),imageView隐藏(需要hide/show),contentSize在滚动视图中更改。 - 问题第一(滚动跳转)
第二:当用户滚动填充的tableView时,一些单元格没有图像,当这个单元格被重用时,Kingfisher也尝试为重用的单元格下载图像。如果图像存在 - imageView 显示,并且单元格像展开一样。
scrollview contentSize 再次发生变化,结果我们有小故障跳跃。
P.S。尝试使用表更新、重新加载行,也对空单元格使用不同的单元格 - 未成功。还尝试在 SO 中找到解决方案,但仅资助理论 :)
有想法(不仅仅是理论)?
谢谢
P.S.S.基于图像的硬编码单元格大小(有或没有)。并且还更改约束 imageView(0 或 xxx)。如果理解正确 - tableView 不知道单元格大小(因为设置了 UITableViewAutomaticDimension)
不是很好的解决方案,但有效。
对于你的第一个问题,有两种方法可以解决。您可以拥有超快的服务器,也可以在您的 arrayOfObjects 中预加载图像高度。也就是说,当您获得对象列表时,您还会检查是否有图像。因此,当您加载单元格时,您无需等待下载然后 show/hide 图片。这样做不仅可以让滚动效果更好,还可以减少对图片服务器的调用。
对于你的第二个问题,在数组中的对象中有一个标志,指示对象是否有图像。如果没有图像,请停止从服务器再次下载。示例代码如下所示:
//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
}
我有自定义的 UITableViewCell:
还有一些对象(从服务器获取)带有 imageURL 属性。
任务:需要异步下载图片(通过 Kingfisher)。如果图像不存在 - 隐藏 ImageView。 有些工作正常,但是:
当图片开始下载时(在后台),用户也可以滚动tableView,如果图片没有下载(image == nil),imageView隐藏(需要hide/show),contentSize在滚动视图中更改。 - 问题第一(滚动跳转)
第二:当用户滚动填充的tableView时,一些单元格没有图像,当这个单元格被重用时,Kingfisher也尝试为重用的单元格下载图像。如果图像存在 - imageView 显示,并且单元格像展开一样。 scrollview contentSize 再次发生变化,结果我们有小故障跳跃。
P.S。尝试使用表更新、重新加载行,也对空单元格使用不同的单元格 - 未成功。还尝试在 SO 中找到解决方案,但仅资助理论 :)
有想法(不仅仅是理论)?
谢谢
P.S.S.基于图像的硬编码单元格大小(有或没有)。并且还更改约束 imageView(0 或 xxx)。如果理解正确 - tableView 不知道单元格大小(因为设置了 UITableViewAutomaticDimension)
不是很好的解决方案,但有效。
对于你的第一个问题,有两种方法可以解决。您可以拥有超快的服务器,也可以在您的 arrayOfObjects 中预加载图像高度。也就是说,当您获得对象列表时,您还会检查是否有图像。因此,当您加载单元格时,您无需等待下载然后 show/hide 图片。这样做不仅可以让滚动效果更好,还可以减少对图片服务器的调用。
对于你的第二个问题,在数组中的对象中有一个标志,指示对象是否有图像。如果没有图像,请停止从服务器再次下载。示例代码如下所示:
//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
}