2017-11-18 144 views
2

雨燕4 + Xcode的9UITableViewCells停止X細胞後正確顯示

我一直在這個問題上幾個星期,試圖解決它自己。我希望任何人都可以提供幫助。我沒有在我最初的問題中發佈任何代碼,因爲它是專有的。如果需要幫助解決我的問題,我會很樂意提供。

我有一個自定義的細胞,其含有子視圖,其中一些被隱藏或顯示(使用1000-priorityheight=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 
} 
+0

可以請你分享一下pic @ joel –

+0

聽起來好像你可能因爲單元重用而有額外的約束。你在做什麼來確保當一個單元格被重用時刪除了添加的任何約束條件?你如何更新縱橫比約束? – vacawama

+0

添加到@vacawama所說的內容:這聽起來很像是單元重用問題。罪魁禍首可能在你的'prepareForReuse'方法中。這應該重置每個被重用到原始狀態的單元。 – Gereon

回答

0

對於任何涉及到誰這個問題,因爲完全缺乏對這個問題的解決方法,我得出的結論是UIKit中是不適合我的目的。我用Texture(以前稱爲AsyncDisplayKit)去了,我的進度已經恢復。