2017-06-21 29 views
2

我有自定義的UITableViewCell:可重複使用的TableViewCell異步高度

enter image description here

也有一定的對象(從服務器獲得)與ImageUrl屬性。

任務:需要異步下載圖片(通過翠鳥)。如果圖像不存在 - 隱藏ImageView。 一些工作正常,但:

  • 當圖像開始下載(背景),用戶也可以滾動的tableView,如果圖像不能下載(圖片==無),ImageView的隱藏(需要隱藏/顯示)和scrollView中的contentSize已更改。 - 問題第一(滾動跳轉)

  • 第二:當用戶滾動填充tableView,一些單元格沒有圖像,並且當這個單元格被重用時,Kingfisher也嘗試下載圖像以重用單元格。如果圖像存在 - imageView顯示,像單元格一樣展開。 再次scrollview contentSize改變,結果我們有毛刺跳轉。

P.S.嘗試使用表更新,重新加載行,也使用不同的單元格爲空單元格 - 不成功。也試圖找到解決的SO,但只資助理論:)

有想法(不僅是理論)?

謝謝

P.S.S.基於圖像的硬編碼單元尺寸(有或沒有)。還要更改約束imageView(0或xxx)。如果理解正確的 - 的tableView不知道細胞的大小(因爲設置UITableViewAutomaticDimension)

不是很好的解決方案,但作品。

enter image description here

回答

0

對於你的第一個問題,有兩種方法可以解決這個問題。你可以有一個超快速的服務器,或者在arrayOfObjects中預載圖像高度。也就是說,當你得到你的對象列表時,你還要檢查是否有圖像。所以當你加載單元格時,你不需要等待下載,然後顯示/隱藏圖像。這樣做不僅可以使滾動更好,還可以減少對圖像服務器的調用。

關於第二個問題,有一個標誌在對象從數組,指示如果對象具有圖像或沒有。如果它沒有映像,請停止再次從服務器下載。示例代碼將如下所示:

//itemObject now has property called loadFlag which set to true by default 

if itemObject.loadFlag { 
    //Your loading image code . If image is nil, set this flag to false 
} else { //This will prevent reused cell having image by default 
    cell.pictureView.isHidden = true 
    cell.picture = nil 
} 
+0

loadFlag - 不起作用。問題不在「旗」(也試過這個)。問題如果(例如)你有沒有圖像的第一個單元(這個單元很小)。向上滾動,當tableView中的單元格出現時 - 與下一個對象(在數組中的隊列中)重用。但這個對象有圖像(說存儲在「標誌」)。當tableView將此圖像設置爲重用單元格時,單元格會展開,並且scrollView將具有跳躍僞影,因爲scrollViewContentSize將保持更大。 –

+0

@SergeyKrasiuk正如我在第一個問題中所說的,除非你得到你的arrayOfObjects圖像信息,否則你不可能阻止單元格的大小調整,你可以通過某種方式知道是否存在圖像。由於此下載是延遲加載,因此單元格高度總是會有時間延遲,並且除非在下載之前知道是否存在圖像,並且在下載之前設置大小,否則總會存在調整大小的事情 –

+0

基於圖像的硬編碼單元大小(有或沒有) - 工作良好 –

相關問題