我正在使用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。
此外,在重新绘制单元格之前,我先留有空格,占位符,然后应用正确的图像/大小进行跳转。
是否可以简单地阻止细胞在应用图像之前完全可见?
答案 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