UITableView在滚动或重新加载tableviewcell之前不会显示远程图像

时间:2019-01-18 06:55:30

标签: ios swift uitableview kingfisher

我正在使用Kingfisher下载和缓存远程图像。

我想在UITableViewCell

中渲染这些图像

当前,直到我滚动图片才显示。

我怀疑这是因为初始图像大小为零,所以当我滚动单元格时将重新绘制并渲染图像。

为消除此问题,我在Kingfisher的完成处理程序中致电了tableView.reloadRows(at: [indexPath], with: .none)

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

    let cell = tableView.dequeueReusableCell(withIdentifier: "FeedTableViewCellId", for: indexPath) as! FeedGifCell

    let url = URL(string: items[indexPath.item])!
    let imageView = ImageResource(downloadURL: url, cacheKey: "\(url)-imageview")
    let placeHolderImage = UIImage.from(hex: "ffffff").resize(width: 1, height: 190)
    cell.gifImage.kf.setImage(with: imageView, placeholder: placeHolderImage) { _ in
        tableView.reloadRows(at: [indexPath], with: .none)
    }

    return cell
}

我已经应用了一个固定高度和宽度的简单占位符,以便在应用图像之前为单元格提供一些高度。

我不确定这是最好的方法,我不喜欢打电话给tableView.reloadRows(at: [indexPath], with: .none),这感觉有点..... hacky。

此外,在重新绘制单元格之前,我先留有空格,占位符,然后应用正确的图像/大小进行跳转。

是否可以简单地阻止细胞在应用图像之前完全可见?

1 个答案:

答案 0 :(得分:1)

不!某个单元格中的图像下载完成后,您无需以任何方式重新加载tableView。除此之外,您所做的一切都正确。我也用翠鸟。

但是将来,您可以在单元格类中创建一个函数,例如setupCell(_ imageURL: URL?)。无论如何,在您的cellForRow方法中,就像这样:

cell.gifImage.kf.setImage(with: imageView, placeholder: placeHolderImage, completionHandler: nil)

现在,如果没有图像下载,或者您没有要为URL对象创建图像URL字符串,则可以在Kingfisher的错误块中捕获它,那么您将需要传递{{1} }(error image的对象指向UIImage,这样就不会有重复的图像。

例如,我在单元格的imageView函数中具有以下内容:

setupCell()

我希望这会有所帮助!

编辑:

对于图像高度的处理,这可能会有所帮助:https://stackoverflow.com/a/52787062/3231194