2015-09-07 57 views
12

我有一個表格視圖,每個單元格都有自己的高度,因此不適合使用rowHeight。相反,現在我正在使用let indexSet = NSIndexSet(index: 10)self.tableView.estimatedRowHeight = 75。這意味着它調用單元上的sizeThatFits函數來確定它的高度。這一切運作良好。UITableView具有動態單元高度在重新加載單元格後向上滾動時跳躍

問題是當你重新加載屏幕上的單元格時。例如向下滾動以顯示單元10,然後重新加載單元10,工作正常。但是當你開始回滾時,通過你已經看到的單元格,它將恢復到每個單元格的估計的高度,完全忽略了sizeThatFits,所以當你滾動時跳轉。我不可能給出一個準確或「足夠好」的估計的高度,這樣跳躍就不會明顯,因爲我的細胞能夠顯示文本行或完整圖像 - 尺寸。

我這裏顯示這個效果:

https://vid.me/edgW

我做了這許多不同的嘗試,使用heightForRowAtIndexPath,estimatedHeightForRowAtIndexPath ..等的混合物。我已經試過各種片關於StackOverflow的建議。似乎沒有任何工作。

我們已經附上一個非常簡單的示例項目,在那裏你可以自己嘗試:

https://www.dropbox.com/s/8f1rvkx9k23q6c1/tableviewtest.zip?dl=0

  1. 運行項目。
  2. 滾動到單元格10在視圖中。
  3. 等待長達5秒的單元重新加載(它變成紫色)。
  4. 向上滾動。

值得注意的 - 這並沒有發生如果當它重新加載該小區不是在視圖中。如果它高於當前滾動點以下的,則一切按預期工作。

+2

不要只發佈一個項目,並要求人們找出您的問題。用相關的代碼更新你的問題。 – rmaddy

+0

我有一個'UICollectionView'類似的問題。這兩者是相似的,所以類似的方法可能對此有所幫助。發佈[答案在這裏](https://stackoverflow.com/a/45361410/6744473) – shoe

回答

15

這種行爲似乎是一個錯誤,如果沒有其他原因,它不再可以在iOS 9上重現。我相信這並沒有太多的安慰。

這個問題主要來自於有一個不準確的估計,就像@NickCatib所說。在iOS 8上可以做的最好的事情就是改善評估。許多人建議的技術是在willDisplayCell中緩存高度,並在後續調用estimatedRowHeightAtIndexPath時使用它們。

您可以通過不做任何事情來讓UITableView放棄其緩存,例如通過直接使用cellForRowAtIndexPath修改單元格中的內容,而不是在屏幕上使用重新加載。但是,如果您實際需要更改單元格的高度,這將無濟於事。

我不敢輕易在表格視圖中修正該bug,因爲您無法控制佈局。通過在失效期間更改contentOffsetAdjustment,該錯誤可以更容易地在子類UICollectionViewFlowLayout中解決,儘管這可能不是非常容易。

+0

這是正確的答案:返回適當的值'estimatedRowHeightAtIndexPath:'完全使這個問題消失。 – MarcWan

+0

我非常愛你。這立即解決了我的問題。作爲一個有趣的副作用,緩存單元高度也使得滾動*真的很快,所以我真的推薦緩存 – Sirens

-1

我正面臨同樣的問題,我的表工作正常,直到tableview重新加載。所以我找到了一個解決方案,只使用rowHeight沒有估計的高度。另外如果你有不同的身高。所以請提供完整的代碼,以便我提供一個解決方案。我有一個像Instagram頁面的單元格。我正在通過計算高度在高度運行方法,它工作正常。但估計高度在這種情況下不能正常工作。如果你使用下面的代碼,它工作正常。請嘗試。

self.tableView.rowHeight = 75 //it will be your dynamic height 
//self.tableView.estimatedRowHeight = 75 

如果你混淆來計算每個單元格的行的高度,只需發佈​​樣本我將提供解決方案。如果我可以 謝謝

0

呃......這是一個棘手的問題來處理。

讓我們來看看Facebook。他們在他們的時間表上遇到了同樣的問題,他們最終以某種網絡視圖的方式做了這件事。

我有一個類似的問題,某種時間軸,使用自動行高度,並有這個問題。首先要解決的是設置estimatedHeight儘可能接近平均細胞高度。這很難處理,因爲你可能有文字(高度50)或圖像+文字(高度1500)。接下來要做的就是改進estimatedHeight forIndexPath,它基本上爲不同的索引路徑返回不同的估計高度。

之後,有很多其他的解決方案,但這是儘可能最接近的,因爲它可以與可變高度(巨大的差異)。

3

我也有這個問題,並使用了我現在無法找到的SO的解決方案。如果我這樣做,我會添加鏈接。以下是解決方案:

問題是表視圖沒有正確估計行高度。要修復它,請先將高度緩存在willDisplayCell中,然後再次使用該高度。

代碼

在viewDidLoad中:

heightAtIndexPath = [NSMutableDictionary new]; 


- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath { 
    NSNumber *height = @(cell.frame.size.height); 
    [heightAtIndexPath setObject:height forKey:indexPath]; 
} 

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{ 
    return UITableViewAutomaticDimension; 
} 

- (CGFloat)tableView:(UITableView *)tableView estimatedHeightForRowAtIndexPath:(NSIndexPath *)indexPath{ 
    if([heightAtIndexPath objectForKey:indexPath]) { 
     return [[heightAtIndexPath objectForKey:indexPath] floatValue]; 
    } else { 
     return UITableViewAutomaticDimension; 
    } 
} 
+1

最後!謝謝!! –

+0

@ kam.voick歡迎您!我不會拿信用來回答這個問題,但我發現它在其他地方,但無法找到它的鏈接了。也歡迎SO! –

相關問題