首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >UICollectionViewCell UIImageView忽略contentMode,溢出图像

UICollectionViewCell UIImageView忽略contentMode,溢出图像
EN

Stack Overflow用户
提问于 2015-02-14 16:58:50
回答 2查看 2.3K关注 0票数 0

一个相当令人沮丧的dilema,其中一个UICollectionViewCell是用一个UIImageView呈现的,因为它只是一个子视图。当加载映像的异步调用完成调用并调用setImage()方法时,将加载框架。因此,通常在设置图像之前,该单元格已经处于视图中。

然而,当图像在单元格呈现时被放置到UIImageView中时,图像不会应用contentMode属性,因此图像以一种非常特殊的方式有效地浮动和重叠相邻的单元格,在滚动时会乱七八糟。

当单元格被重复使用时,即你从破碎的区域滚动,然后返回到它,细胞看起来又正常了。

当单元格加载时所看到的:

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

是什么导致了这种不寻常的行为?映像从服务器加载异步,然后本地缓存。如果我在集合上使用.reloadData(),那么单元格也会“修复”自己。在第一次运行之后或加载时,它们都会出现混淆。

显示单元格重用方法和init方法的代码示例如下:

代码语言:javascript
复制
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()
    }
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-02-17 14:35:55

当涉及到自动布局时,我不是很有用,但是我看起来内容视图有基于图像视图的约束,而图像视图在那个时候没有大小或帧。设置图像时,将图像视图框架建立在基于图像视图的内容视图上。这可以解释为什么它只在第一次通过之后才正确工作。我不是100%,它将修复这个问题,但是为init中的图像视图创建一个框架,基于帧的宽度和高度在init上传递可能有效。

代码语言:javascript
复制
setTranslatesAutoresizingMaskIntoConstraints

可能是主犯。

票数 1
EN

Stack Overflow用户

发布于 2020-05-24 15:02:00

我也面临着同样的问题。解决方案来自另一个问题的answer

只需使用接口生成器将集合视图的估计大小设置为none即可。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28517926

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档