我正在使用AlamofireImage在UITmageView中的UIImageView上设置图像,如下所示:
cell.imageView.af_setImageWithURL(url)
下载后图片无法显示。它将在第二次从内存缓存加载时显示图像。
使用占位符图像似乎有所不同。
这适用于打印(下载)图像的地址:
cell.imageView.af_setImageWithURL(URL, placeholderImage: UIImage(named: "placeholder"), filter: nil, imageTransition: .None, completion: { (response) -> Void in
print("image: \(cell.imageView.image)")
})
这不起作用并打印" image:nil"
cell.imageView.af_setImageWithURL(URL, placeholderImage: nil, filter: nil, imageTransition: .None, completion: { (response) -> Void in
print("image: \(self.image)")
})
在执行af_setImageWithURL:
cell.imageView.image = UIImage()
这是UITableViewCell,AlamofireImage中的错误还是我做错了什么?
答案 0 :(得分:4)
这个问题已有几年历史了,但也许这个答案对于有类似问题的其他人有用,就像我之前找到正确的解决方案一样。
由于图像是异步加载的,如果我们没有为UIIMageView 提供固定的高度,我们必须在下载完成时强制更新单元格。这是因为单元更新(即AutoLayout约束重新计算)仅在cellForRowAt
方法之后自动完成,该方法在第一次显示单元格时调用,或者在滚动表格以显示其他单元格时。在这两种情况下,图像都可能尚未通过af_setImage()
方法下载,因此只显示占位符,因为它们的大小目前尚不清楚。
要强制更新单元格,我们需要使用beginUpdates()
和endUpdates()
方法,将它们放在.af_setImage()
的完成处理程序中。这样,每次下载完成后,单元格都会更新。
但是,为了避免循环,在调用beginUpdates()
/ endUpdates()
之前,我们必须检查之前是否已经更新了单元格,因为通过调用这些方法, cellForRowAt
方法再次被调用,因此af_setImage()
及其完成关闭,其中包含beginUpdates()
/ endUpdates()
。
这意味着我们必须仅在下载完成时更新单元格,而不是在图像已经兑现时更新(因为,如果它已兑现,则表示我们已经更新细胞)。这可以通过检查完成处理程序的响应来完成:如果它不是nil
,则图像刚刚下载,如果它是nil
,则图像被兑现。
作为附带好处,细胞高度将自动调整(记得在tableView.estimatedRowHeight = 400
方法中放置tableView.rowHeight = UITableViewAutomaticDimension
和viewDidLoad()
)
最后,这是代码:
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
// Dequeue your cell
let cell = self.tableView.dequeueReusableCell(withIdentifier: "YourCustomCellIdentifier") as! YourCustomTableViewCell
// get picture url from the data array
let pictureUrl = self.yourCellsData[indexPath.row].pictureUrl
// async download
cell.pictureView.af_setImage(
withURL: URL(string: pictureUrl)!,
placeholderImage: UIImage(named: "YourPlaceholder.png"),
filter: nil,
imageTransition: UIImageView.ImageTransition.crossDissolve(0.5),
runImageTransitionIfCached: false) {
// Completion closure
response in
// Check if the image isn't already cached
if response.response != nil {
// Force the cell update
self.tableView.beginUpdates()
self.tableView.endUpdates()
}
}
return cell
}
那是所有人! ; - )
答案 1 :(得分:1)
您可以通过添加2行代码来打印错误,以便您更好地了解该问题。
cell.imageView.af_setImageWithURL(URL, placeholderImage: UIImage(named: "placeholder"), filter: nil, imageTransition: .None, completion: { (response) -> Void in
print("image: \(cell.imageView.image)")
print(response.result.value) //# UIImage
print(response.result.error) //# NSError
})
在我的情况下,图片网址存在问题。我在浏览器中打开它时正在下载图像。