簡體   English   中英

UICollectionViewCell UIImageView 忽略 contentMode,溢出圖像

[英]UICollectionViewCell UIImageView ignores contentMode, overflows image

一個相當令人沮喪的困境,其中 UICollectionViewCell 使用 UIImageView 呈現,因為它只是子視圖。 當加載圖像的異步調用完成調用並調用 setImage() 方法時加載框架。 因此,通常在設置圖像之前單元格已經在視圖中。

然而,當在渲染單元格時將圖像放入 UIImageView 時,圖像不會應用 contentMode 屬性,因此圖像有效地浮動並以一種相當奇特的方式重疊相鄰的單元格,滾動時會亂七八糟。

當單元格被重新使用時,即您從損壞的區域滾開然后又回到它,單元格再次顯示正常。

單元格加載時您看到的內容:

滾動然后回到視圖中,單元格正常組織起來......單元格具有橙色背景色,因此可以在加載圖像之前看到它們,所有單元格確實以所需的大小/位置呈現。 它是溢出每個單元格的圖像(即使 clipToBounds 為真)。

是什么導致了這種異常行為? 圖像從服務器異步加載,然后在本地緩存。 如果我 .reloadData() 在集合上,那么單元格也會“修復”自己。 在第一次運行后或加載時,它們是否看起來都混在一起了。

顯示單元重用方法和初始化方法的代碼示例如下:

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()
    }
}

在自動布局方面,我不是很有用,但我看起來內容視圖具有基於圖像視圖的約束,而此時沒有大小或框架。 當您設置圖像時,您將圖像視圖框架基於基於圖像視圖的內容視圖。 這可以解釋為什么它只有在第一次通過后才能正常工作。 我不是 100% 它會解決這個問題,但是根據在 init 中傳入的框架的寬度和高度在 init 中為圖像視圖創建一個框架可能會起作用。

setTranslatesAutoresizingMaskIntoConstraints

可能是主犯。

我面臨着完全相同的問題。 解決方案來自另一個問題的答案

只需使用界面構建器將集合視圖的估計大小設置為無即可。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM