2013-01-17 95 views
2

我想基於一些動態內容設置UITableViewCell的高度。我知道你可以通過視圖控制器中的heightForRowAtIndexPath委託方法「設置」高度,但是......我不能那樣做!設置UITableViewCell高度*無*使用heightForRowAtIndexPath

問題是,直到調用cellForRowAtIndexPath才能知道單元格的高度,並且在 cellForRowAtIndexPath之前調用了heightForRowAtIndexPath

所以,我需要以某種方式顛倒這兩種方法的調用順序,或者找到另一種設置單元格高度的方法。

任何想法?

+1

要麼你必須計算'viewDidLoad'中的高度,並將其添加到數組中,並使用它或在'heightForRowAtIndexPath'方法中執行計算。你不能逆轉訂單。 – iDev

+0

無論你在cellForRowAtIndexPath中做什麼計算來獲取高度,爲什麼你不能在heightForRowAtIndexPath中做同樣的計算? –

+3

@ACB是正確的(像往常一樣!)。你必須這樣做。您需要重新考慮如何或何時計算行高 - 它應該基於您的模型,在開始描述表視圖之前應該知道這個模型。 _爲什麼你不能按照正常的順序去做? – jrturton

回答

0

對不起 - 沒有內置的方法來反轉這些方法或任何類似的東西。其中一個原因是,表格視圖可能想知道行的高度,原因很多,但並非所有這些都包括顯示單元格 - -tableView:heightForRowAtIndexPath:可能會多次調用,或者-tableView:cellForRowAtIndexPath:可能根本不會被調用調用height方法。

什麼你可以做的是找到另一種方式來計算提前適當的高度,它緩存,並依靠-tableView:heightForRowAtIndexPath:緩存的價值。我已經設法通過構建一個「虛擬」UITableViewCell實例來做類似的事情,將它保留在正常重用隊列之外,並將其用於佈局和高度確定目的。這樣的解決方案將如下所示:

  1. 獲取-tableView:heightForRowAtIndexPath:
  2. 在高度緩存中查找索引路徑。如果您有價值,請將其退回。
  3. 否則,使用您的虛擬單元佈局將出現在該索引路徑的內容。測量單元格的高度並緩存它。
  4. 多次重複步驟1-3,具體取決於調用多少-tableView:heightForRowAtIndexPath:
  5. 獲取-tableView:cellForRowAtIndexPath:
  6. 從正常重用隊列中取出一個單元格,填充它,佈局並返回。 (您可以選擇驗證其高度是否與預先計算的高度相匹配,以便表格視圖具有您期望的行爲)。

根據您的單元格的內容和短語的複雜性,「佈置它「在您的使用案例中,當您計算前幾個高度時,或者在用戶快速滾動您的表格視圖時,這可能會導致合理的性能下降。但是,隨着緩存的升溫,應用程序繼續運行時,您應該計算越來越少的高度。最後一點:請記住,對於默認高度(可能不會出現在表格中)的單元格,您可以通過返回tableView.rowHeight來提前退出,而不是每次出現時計算默認高度。這可以稍微緩解上述方法的計算負擔。

相關問題