UICollectionViewCell 中图像的异步加载导致标签消失

Posted

技术标签:

【中文标题】UICollectionViewCell 中图像的异步加载导致标签消失【英文标题】:Asynchronous loading of image in UICollectionViewCell causes labels to disappear 【发布时间】:2018-03-12 22:34:23 【问题描述】:

我正在开发一个照片库应用程序,它基本上由一个导航控制器组成,在该控制器上加载了一个集合视图的实例。每个集合视图单元都包含一个 UIImageView 和一个图像名称标签。单元格异步加载图像。

第一次加载每个集合视图时,这一切都很好,但是如果您退回到前一个集合视图并再次前进,标签就会消失。

我认为它必须与异步加载图像有关,好像我删除图像加载标签很好,有正确的文本并且不会消失。

我不知道我在加载图像时哪里出错了......

各种组件是:

使用此扩展方法加载图像:

extension UIImageView 
public func imageFromServerURL(url: URL) 

    if ImageData.realPhotoCache.keys.contains(url.absoluteString)
        self.image = ImageData.realPhotoCache[url.absoluteString];
    else


        URLSession.shared.dataTask(with: url, completionHandler:  (data, response, error) -> Void in

            if error != nil 
                print(error)
                return
            
            DispatchQueue.main.async(execute:  () -> Void in
                let image = UIImage(data: data!)
                ImageData.realPhotoCache[url.absoluteString] = image;
                self.image = image
            )

        ).resume()
    

集合视图的单元格是这样连接的:

override func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell 

    var cell: UICollectionViewCell;

    cell = collectionView.dequeueReusableCell(withReuseIdentifier: photoCellReuseIdentifier, for: indexPath);

    let imageProvider = self.imageProviderForIndexPath(indexPath: indexPath);
    (cell as! tsPhotoCollectionViewCell).photoView.imageFromServerURL(url: imageProvider.GetThumbImageUrl());
    (cell as! tsPhotoCollectionViewCell).titleLabel.text = imageProvider.GetImageTitle()!;

    return cell

集合视图在返回时被重置,如下所示:

 func reset()
    photoProviders = [ImageDataProvider]();
    self.collectionView?.reloadSections(IndexSet(integer: 0))
    startLoad()



override func viewWillAppear(_ animated: Bool) 
    if(hasNavigatedAway)
        hasNavigatedAway = false;
        self.reset();
    

集合的第一次加载通常会很好(绿色单元格,红色标签):

https://imgur.com/g3p03yF

但在离开并返回集合视图时,标签消失了:

https://imgur.com/If2FQZS

标签有时也会随着滚动来来去去。我已经尝试了我能想到的一切,但没有任何运气..

【问题讨论】:

如何布置图像视图和标签?你使用动态单元格大小吗?此外,您的异步图像加载有潜在的错误 - 如您所知,当您滚动集合视图时,单元格会被重用,所以假设您的图像视图正在加载一个巨大的图像,并且当它这样做时您滚动集合并分配新的图像 URL到加载速度比前一个更快的单元格。之后,第一个图像被下载并覆盖第二个。 你能检查一下imageProvider.GetImageTitle()!是否返回非空字符串吗? @DanKarbayev 单元格在主情节提要中定义,它们使用约束来定位图像和标题标签。是的,图片加载的下一步是添加一些东西来取消请求,或者检查下载完成后应用的图片是否正确,您会推荐一种特定的方法吗? @DanKarbayev 我将单元格创建更改为将GetImageTitle() 放入变量并打印出来,它肯定包含正确的非空字符串标题。 @HenryThomas 尝试增加 UILabel 的垂直内容抗压缩优先级 【参考方案1】:

从你的截图来看,UILabels 的高度似乎被扩展的 UIImageView 压缩到了 0。尝试将 UILabel 的垂直内容压缩阻力优先级提高到 1000,使其变为不可压缩(进而使自动布局引擎压缩 UIImageView 或间距 - 取决于您的约束)。

【讨论】:

以上是关于UICollectionViewCell 中图像的异步加载导致标签消失的主要内容,如果未能解决你的问题,请参考以下文章

修复项目组件中图像的大小

为啥 Qt 中图像的大小会增加?

OpenCV中图像的格式Mat 图像深度

TensorBoard 中图像的列和行是啥意思?

PIL包中图像的mode参数

PIL包中图像的mode参数