雨燕4 + Xcode的9UITableViewCells停止X細胞後正確顯示
我一直在這個問題上幾個星期,試圖解決它自己。我希望任何人都可以提供幫助。我沒有在我最初的問題中發佈任何代碼,因爲它是專有的。如果需要幫助解決我的問題,我會很樂意提供。
我有一個自定義的細胞,其含有子視圖,其中一些被隱藏或顯示(使用1000-priority
height=0
約束其期間cellForRowAt
添加和刪除),這取決於數據的一個非常複雜的佈局的UITableView
。還有一個ImageView
,它應該始終是全寬,並且應該更改高度以匹配通過Kingfisher.shared.retrieveImage()
加載的圖像。一旦我有了圖像,我就更新了該單元圖像上的aspectRatio
約束,並顯示單元格。這適用於前15-20個單元格,但當我滾動更多行時,它會停止運行。圖像很小,居中,某些數據字段沒有更新等。如果我繼續滾動,有時候一個單元格會在這裏和那裏正確行爲,但幾乎都不會。
現在有趣的部分:如果我滾動備份,每一個單元格會自動重新格式化,看起來應該是這樣,之後,每個單元格都是完美的。代碼顯然是有效的 - 我覺得這可能是平臺中的一個bug,但在我假設之前,我想看看是否有其他人遇到過這樣的問題。
再次,非常感謝您提供的任何幫助 - 我非常渴望解決這個問題。
更新:要回答幾個問題,這裏是自定義單元類的一部分代碼片段。這是我如何設置單元格的圖像(其中包括更新寬高比約束),以及如何重置單元格以供重用。
internal var aspectConstraint : NSLayoutConstraint? {
didSet {
if oldValue != nil {
imageView.removeConstraint(oldValue!)
}
if aspectConstraint != nil {
imageView.addConstraint(aspectConstraint!)
}
}
}
override func prepareForReuse() {
super.prepareForReuse()
aspectConstraint = nil
imageView.image = nil
for view in subviews {
for c in view.constraints {
if c.firstAttribute == NSLayoutAttribute.height && c.constant == 0 {
view.removeConstraint(c)
}
}
}
}
func setCustomImage(image : UIImage) {
let aspect = image.size.width/image.size.height
let constraint = NSLayoutConstraint(item: imageView, attribute: NSLayoutAttribute.width, relatedBy: NSLayoutRelation.equal, toItem: imageView, attribute: NSLayoutAttribute.height, multiplier: aspect, constant: 0.0)
constraint.priority = UILayoutPriority(999)
aspectConstraint = constraint
imageView.image = image
}
可以請你分享一下pic @ joel –
聽起來好像你可能因爲單元重用而有額外的約束。你在做什麼來確保當一個單元格被重用時刪除了添加的任何約束條件?你如何更新縱橫比約束? – vacawama
添加到@vacawama所說的內容:這聽起來很像是單元重用問題。罪魁禍首可能在你的'prepareForReuse'方法中。這應該重置每個被重用到原始狀態的單元。 – Gereon