UITableView 在滚动或重新加载 tableviewcell 之前不显示远程图像
Posted
技术标签:
【中文标题】UITableView 在滚动或重新加载 tableviewcell 之前不显示远程图像【英文标题】:UITableView not showing remote image until scroll or reload of tableviewcell 【发布时间】:2019-01-18 06:55:29 【问题描述】:我正在使用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。
此外,在重绘单元格之前,我有空白区域、占位符,然后在应用正确的图像/大小时跳转。
在应用图像之前,是否可以简单地阻止单元格可见?
【问题讨论】:
gifImage是imageView,.kf是KingFisher库下载图片。 gifImage 是我单元格中的UIImageView
,.kf
是 Kingfisher 提供的用于将图像加载到视图中的扩展
这是您可以使用的工作代码。 ***.com/a/51746517/10150796
【参考方案1】:
不!在某个单元格中的图像完成下载后,您不必以任何方式重新加载 tableView。除此之外,你做的一切都是正确的。我也用翠鸟。
但是在未来,你可以在你的单元格类中创建一个函数,比如setupCell(_ imageURL: URL?)
。无论如何,继续,在你的 cellForRow
方法中,这样做:
cell.gifImage.kf.setImage(with: imageView, placeholder: placeHolderImage, completionHandler: nil)
现在,如果没有下载图像或没有图像 URL 字符串用于 URL
对象,您可以在 Kingfisher 的错误块中捕获它,然后您需要传递您的 error image
(@ 987654327@) 对象到您的imageView
,这样就不会有重复的图像。
例如,我的单元格的setupCell()
函数中有以下内容:
if let url = vendor.image?.URLEscaped
let resource = ImageResource(downloadURL: url, cacheKey: url.absoluteString)
self.imageView_Vendor.kf.setImage(with: resource, options: [.transition(.fade(0.2)), .cacheOriginalImage])
return
self.imageView_Vendor.image = nil
我希望这会有所帮助!
编辑:
对于图像高度的处理,这可能会有所帮助:https://***.com/a/52787062/3231194
【讨论】:
啊,谢谢,这效果要好得多,但是,并非我所有的 gif 都具有相同的高度,并且在初始渲染时它们的大小与我的占位符相同,只有在滚动时它们才合适:/以上是关于UITableView 在滚动或重新加载 tableviewcell 之前不显示远程图像的主要内容,如果未能解决你的问题,请参考以下文章
UITableView 在使用 Swift 中的 Master Detail App 滚动之前不会重新加载