我正在使用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)") })
在执行之前将单元格imageView设置为空图像时也可以 af_setImageWithURL:
cell.imageView.image = UIImage()
这是UITableViewCell,AlamofireImage中的错误还是我做错了什么?
这个问题已经有几年历史了,但是对于像我这样的人,找到合适的解决方案之前,这个问题可能对其他人很有用。
由于图像是异步加载的,因此如果我们不为UIIMageView提供固定高度,则必须在下载完成后强制进行单元更新。这是因为单元格更新(即自动布局约束重新计算)仅在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
}
那是所有人!;-)