我正在开发一个照片库应用程序,该应用程序基本上包含一个导航控制器,其上载有集合视图的实例。每个集合视图单元格都包含一个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();
}
}
集合的第一次加载通常很好(绿色的单元格,红色的标签):
但是在离开并返回集合视图时,标签已经消失:
标签似乎也有时会滚动。我已经尝试了所有我能想到的东西,但没有运气......
答案 0 :(得分:0)
根据你的截图判断,似乎UILabels通过扩展的UIImageViews将其高度压缩为0。尝试将UILabel的垂直内容压缩阻力优先级提高到1000,这样它就变得不可压缩(反过来,使自动布局引擎压缩UIImageView或间距 - 取决于你的约束)。