当前位置:  开发笔记 > IOS > 正文

没有占位符图像的UITableViewCell中的AlamofireImage af_setImageWithURL

如何解决《没有占位符图像的UITableViewCell中的AlamofireImageaf_setImageWithURL》经验,为你挑选了1个好方法。

我正在使用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中的错误还是我做错了什么?



1> Guido..:

这个问题已经有几年历史了,但是对于像我这样的人,找到合适的解决方案之前,这个问题可能对其他人很有用。

由于图像是异步加载的,因此如果我们不为UIIMageView提供固定高度,则必须在下载完成后强制进行单元更新。这是因为单元格更新(即自动布局约束重新计算)仅在cellForRowAt方法之后自动进行,方法是在第一次显示单元格时或在滚动表以显示其他单元格时调用。在这两种情况下,该af_setImage()方法可能都尚未下载图像,因此由于占位符暂时未知,因此将不显示占位符。

要强制更新单元格,我们需要使用beginUpdates()endUpdates()方法,将它们放在的完成处理程序中.af_setImage()。这样,每次下载完成时,单元都会被更新。

但是,为了避免循环,在调用beginUpdates()/ 之前,endUpdates()我们必须检查之前是否已经更新了单元格,因为通过调用这些方法,该cellForRowAt方法将被再次调用,并因此调用,并af_setImage()使用beginUpdates()/对其endUpdates()内部的完成闭包。

这意味着我们仅在下载刚刚完成时才更新单元,而不是在图像已经兑现时才更新(因为如果图像已兑现,则意味着我们已经更新了单元)。这可以通过检查完成处理程序的响应来完成:如果不是nil,则仅对图像进行下垂;如果为nil,则对图像进行兑现。

作为一个附带的好处,小室高度会自动地调整(记得把 tableView.estimatedRowHeight = 400tableView.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
        }

那是所有人!;-)

推荐阅读
牛尾巴2010
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有