AlamofireImage af_setImageWithURL在没有占位符图像的UITableViewCell中
我使用AlamofireImage在UITableViewCell中的UIImageView上设置图像,如下所示:
cell.imageView.af_setImageWithURL(url)
下载后不显示图像。 它将在从内存caching中加载的第二次显示图像。
看来,使用占位符图像使所有的差异。
这工作并打印(下载)图像的地址:
cell.imageView.af_setImageWithURL(URL, placeholderImage: UIImage(named: "placeholder"), filter: nil, imageTransition: .None, completion: { (response) -> Void in print("image: \(cell.imageView.image)") })
这不起作用,并打印“图像:无”
cell.imageView.af_setImageWithURL(URL, placeholderImage: nil, filter: nil, imageTransition: .None, completion: { (response) -> Void in print("image: \(self.image)") })
在执行af_setImageWithURL:
之前,将单元格af_setImageWithURL:
设置为空的图像也可以工作af_setImageWithURL:
cell.imageView.image = UIImage()
这是UITableViewCell,AlamofireImage中的错误还是我做错了什么?
您可以通过添加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 })
在我的情况下,图片url存在问题。 当我在浏览器中打开它时,它正在下载图像。
这个问题已经有几年了,但也许这个答案可能对其他有类似问题的人有用,就像我之前find正确的解决scheme一样。
由于图像是asynchronous加载的,如果我们没有为UIIMageView提供固定的高度, 我们必须在下载完成时强制更新单元格 。 这是因为单元格更新(即AutoLayout约束重新计算)仅在cellForRowAt
方法后自动完成,这是在第一次显示单元格时调用的,或者是在滚动表格以显示其他单元格时调用的。 在这两种情况下,可能图像还没有被af_setImage()
方法下载,所以只有占位符将被显示,因为它们的大小暂时是未知的。
为了强制更新单元格,我们需要使用beginUpdates()
和endUpdates()
方法,将它们放在.af_setImage()
的完成句柄中。 这样,每次下载完成,单元格将被更新。
但是,为了避免循环 ,在调用beginUpdates()
/ endUpdates()
之前,我们必须先检查是否已经更新了单元格,因为通过调用这些方法, cellForRowAt
方法被再次调用,因此af_setImage()
及其用beginUpdates()
/ endUpdates()
里面的完成closures)。
这意味着我们必须在下载完成后更新单元格,而不是在图像已经被兑现时 (因为如果是兑现的话,意味着我们已经更新了单元格)。 这可以通过检查完成处理程序的响应来完成:如果它不是nil
,那么图像只是向下倾斜,如果是nil
,则图像被兑现。
作为一个副作用,单元格高度将被自动调整(记得在你的viewDidLoad()
方法中放置tableView.estimatedRowHeight = 400
和tableView.rowHeight = UITableViewAutomaticDimension
)
最后,这里是代码:
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 }
这就是所有人! 😉