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

时间:2018-03-12 22:34:24

标签: ios swift uicollectionview uiimageview uicollectionviewcell

我正在开发一个照片库应用程序,该应用程序基本上包含一个导航控制器,其上载有集合视图的实例。每个集合视图单元格都包含一个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

标签似乎也有时会滚动。我已经尝试了所有我能想到的东西,但没有运气......

1 个答案:

答案 0 :(得分:0)

根据你的截图判断,似乎UILabels通过扩展的UIImageViews将其高度压缩为0。尝试将UILabel的垂直内容压缩阻力优先级提高到1000,这样它就变得不可压缩(反过来,使自动布局引擎压缩UIImageView或间距 - 取决于你的约束)。