【发布时间】:2019-03-20 11:28:20
【问题描述】:
我有一个水平的UICollectionView,我在其中显示异步加载的图像。单元格的宽度应该适合图像。
在我的视图控制器的viewDidLoad 中,我设置了估计的单元格大小:
(collectionView.collectionViewLayout as? UICollectionViewFlowLayout)?.estimatedItemSize = CGSize(width: 400, height: 400)
在cellForItem,我使用Kingfisher启动下载任务:
cell.imageView.kf.setImage(with: url) { (_, _, _, _) in
cell.layoutSubviews()
}
在我的单元格中,layoutSubviews 方法中有以下代码:
// 326 is the image view's height
// .aspectRatio is a custom extension that returns: size.width / size.height
imageViewWidthConstraint.constant = 326 * image.aspectRatio
layoutIfNeeded()
在情节提要中,我已正确设置布局约束,以便单元格宽度尊重imageViewWidthConstraint。
以下是运行我的应用时的结果:
如您所见,单元格的宽度为 400,尽管已加载图像并更新了布局。因此,图像会被拉伸以填充图像视图。
当我向右滚动然后返回时,单元格将从集合视图中删除并重新加载,现在布局正确:
在滚动时,单元格会调整它们的宽度,有时会调整到正确的宽度,有时会调整到错误的宽度。
我在这里做错了什么?
【问题讨论】:
-
嗨,我刚刚用 tableView 实现了同样的东西。这是Link。我必须保持宽度不变并根据图像尺寸动态调整高度。看看代码以获得一个想法。基本上,您应该在
SizeForItemAt IndexPath返回大小,并且您的图像应该固定到集合视图。 -
@AwaisFayyaz 您如何为收藏视图执行此操作?
标签: ios swift asynchronous uicollectionview