所以在我的集合视图单元格中我有文字和图像:这是我在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有关吗?
注意:此错误仅发生在第一个单元格中,其他具有图像的单元格正常
答案 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作为我将要保留在缓存中的图像的关键字。每当我尝试从互联网上加载图像时,我都会检查图像是否已经在缓存中,如果是,我将图像设置为缓存中的图像,如果没有,我将其从加载中加载互联网异步。