一个相当令人沮丧的dilema,其中一个UICollectionViewCell是用一个UIImageView呈现的,因为它只是一个子视图。当加载映像的异步调用完成调用并调用setImage()方法时,将加载框架。因此,通常在设置图像之前,该单元格已经处于视图中。
然而,当图像在单元格呈现时被放置到UIImageView中时,图像不会应用contentMode属性,因此图像以一种非常特殊的方式有效地浮动和重叠相邻的单元格,在滚动时会乱七八糟。
当单元格被重复使用时,即你从破碎的区域滚动,然后返回到它,细胞看起来又正常了。
当单元格加载时所看到的:

滚开,回到视野中,细胞组织正常.这些单元格具有橙色的背景颜色,因此在加载图像之前就可以看到它们,所有的单元格实际上都呈现在所需的大小/位置。是图像溢出了每个单元格(尽管clipToBounds是真的)。

是什么导致了这种不寻常的行为?映像从服务器加载异步,然后本地缓存。如果我在集合上使用.reloadData(),那么单元格也会“修复”自己。在第一次运行之后或加载时,它们都会出现混淆。
显示单元格重用方法和init方法的代码示例如下:
class ThumbnailCell: UICollectionViewCell {
var imageView: UIImageView!
override init(frame: CGRect) {
super.init(frame: frame)
imageView = UIImageView(frame: contentView.bounds)
imageView.image = nil
imageView.clipsToBounds = true
imageView.contentMode = .ScaleAspectFill
imageView.setTranslatesAutoresizingMaskIntoConstraints(false)
contentView.addSubview(imageView)
let viewsDictionary = ["imageView" : imageView]
contentView.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("H:[imageView]", options: .allZeros, metrics: nil, views: viewsDictionary))
contentView.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("V:[imageView]", options: .allZeros, metrics: nil, views: viewsDictionary))
}
func resetImage() {
self.imageView.contentMode = .ScaleAspectFill
self.imageView.frame = contentView.bounds
self.imageView.clipsToBounds = true
}
func setImage(image: UIImage) {
resetImage()
self.imageView.image = image
}
override func prepareForReuse() {
super.prepareForReuse()
self.imageView.image = nil
resetImage()
}
}发布于 2015-02-17 14:35:55
当涉及到自动布局时,我不是很有用,但是我看起来内容视图有基于图像视图的约束,而图像视图在那个时候没有大小或帧。设置图像时,将图像视图框架建立在基于图像视图的内容视图上。这可以解释为什么它只在第一次通过之后才正确工作。我不是100%,它将修复这个问题,但是为init中的图像视图创建一个框架,基于帧的宽度和高度在init上传递可能有效。
setTranslatesAutoresizingMaskIntoConstraints可能是主犯。
发布于 2020-05-24 15:02:00
我也面临着同样的问题。解决方案来自另一个问题的answer。
只需使用接口生成器将集合视图的估计大小设置为none即可。
https://stackoverflow.com/questions/28517926
复制相似问题