【问题标题】:Reusable TableViewCell asynchronous height可复用的 TableViewCell 异步高度
【发布时间】:2017-11-24 10:09:24
【问题描述】:

我有自定义 UITableViewCell:

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

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

  • 当图像开始下载(在后台)时,用户还可以滚动 tableView,如果图像未下载(图像 == nil),图像视图隐藏(需要隐藏/显示)和滚动视图中的 contentSize 发生变化。 - 问题第一(滚动跳转)

  • SECOND:当用户滚动填充的 tableView 时,一些单元格没有图像,当这个单元格被重用时,Kingfisher 也尝试为重用的单元格下载图像。如果图像存在 - imageView 显示,并且单元格像展开一样。 滚动视图的 contentSize 再次发生了变化,结果我们出现了故障跳跃。

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

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

谢谢

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

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

【问题讨论】:

    标签: ios swift uitableview swift3 swift2


    【解决方案1】:

    对于您的第一个问题,有两种方法可以解决它。您可以拥有一个超快速的服务器,或者在您的 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
    }
    

    【讨论】:

    • loadFlag - 无济于事。问题不在“标志”中(也尝试过)。如果(示例)您有第一个没有图像的单元格(这个单元格很小),则会出现问题。您向上滚动,当单元格超出 tableView 时 - 与下一个对象重用(在数组中的队列中)。但是这个对象有图像(说存储在“标志”中)。当tableView为重用单元格设置此图像时,单元格被展开,并且scrollView会有跳转神器,因为scrollViewContentSize会保持更大。
    • @SergeyKrasiuk 正如我在问题一中所说,没有办法阻止单元格的大小调整,除非当您获取带有图像信息的 arrayOfObjects 时,您可以以某种方式知道是否有图像。由于此下载是延迟加载,因此单元格高度始终存在时间延迟,并且始终存在调整大小的事情,除非您在下载之前知道是否有图像并在下载之前设置大小
    • 基于图像的硬编码单元格大小(有或没有) - 效果很好
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多