为什么我的Collectionview cell.image消失了,搞砸了?

时间:2017-04-07 22:37:51

标签: ios swift uicollectionview

所以在我的集合视图单元格中我有文字和图像:这是我在CollectionViewLayout中的代码。

func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {

    if let content = HomeCollectionViewController.posts[indexPath.item].content {
        let spaceForPostContentLabel = NSString(string: content).boundingRect(with: CGSize(width: view.frame.width - 32, height: 120), options: NSStringDrawingOptions.usesFontLeading.union(NSStringDrawingOptions.usesLineFragmentOrigin), attributes: [NSFontAttributeName: UIFont.systemFont(ofSize: 15)], context: nil)

        if HomeCollectionViewController.posts[indexPath.item].imageURL != nil {
            return CGSize(width: view.frame.width, height: spaceForPostContentLabel.height + postImageViewOriginHeight + 168.0)
        } else {
            return CGSize(width: view.frame.width, height: spaceForPostContentLabel.height + 152.5)
        }
    } else {
        return CGSize(width: view.frame.width, height: 408.5)
    }
}

首次加载时,一切都很好。但是当我向下滚动并再次向上滚动时,一切都搞砸了,图像消失了,并且有一个巨大的空白区域,图像应该存在。这与dequeReusableIdentifier有关吗?

  

注意:此错误仅发生在第一个单元格中,其他具有图像的单元格正常

1 个答案:

答案 0 :(得分:0)

由于出列的原因,可能会发生这种情况。即使您有100个单元格,同时加载的单元格也有限制,因此在此限制之后,您在滚动时开始重复使用旧单元格。

我已经遇到过同样的问题,有时主要是在使用图像时,我发现的最佳方法是对图像使用缓存。

下面我使用AlamofireImage发布一个示例来创建缓存(但您可以使用您喜欢的缓存,甚至是Swift库提供的内置缓存。

import AlamofireImage

let imageCache = AutoPurgingImageCache()

class CustomImageView: UIImageView {

    var imageUrlString: String?

    func loadImageFromURL(_ urlString: String){

            imageUrlString = urlString

            let url = URL(string: urlString)

            image = nil

            if let imageFromCache = imageCache.image(withIdentifier: urlString) {
                self.image = imageFromCache
                return
            }

            URLSession.shared.dataTask(with: url!, completionHandler: { (data, response, error) in

                if error != nil {
                    print(error)
                    return
                }

                DispatchQueue.main.async(execute: {

                    let imageToCache = UIImage(data: data!)

                    if self.imageUrlString == urlString {
                        self.image = imageToCache
                    }

                    imageCache.add(imageToCache!, withIdentifier: urlString)
                })

            }).resume()
    }

}

基本上我正在创建UIImageView的子类,并添加图像URL作为我将要保留在缓存中的图像的关键字。每当我尝试从互联网上加载图像时,我都会检查图像是否已经在缓存中,如果是,我将图像设置为缓存中的图像,如果没有,我将其从加载中加载互联网异步。