[英]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.