2013-01-08 77 views
0

在我的應用程序中,它有大約1000個內容顯示在tableView中。每個內容都有不同的高度,因爲其中有一到三行UILabel。目前,它計算並返回每個單元格的高度在的tableView委託功能:計算單元格高度的正確方法

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath 

它計算的方法是:

contentCell = (RSContentViewCell *)self.tmpCell; 
UIFont *font = contentCell.myTextLabel.font; 
width = contentCell.myTextLabel.frame.size.width + 30; 

size = [contentStr sizeWithFont:font 
    constrainedToSize:CGSizeMake(width, CGFLOAT_MAX) 
    lineBreakMode:contentCell.myTextLabel.lineBreakMode]; 

height = size.height; 
return height; 

它的工作原理,但需要大約0.5秒來計算的高度,所以用戶體驗不太好,因爲在計算過程中應用程序將不會有任何反應。 那麼什麼是正確的方法和計算這些細胞高度的正確位置在哪裏?

UPDATE

的數據是從服務器,並在該輸入表格視圖中的時間要求。

+0

這個函數一次調用需要0.5秒? –

+0

這聽起來不正確。 – Fogmeister

+0

千個細胞需要0.5秒 –

回答

0

您仍然必須在前端執行此操作,但只執行一次並將結果緩存到Array中,並將其用於將來調用。

即第一次數組值是空的,所以計算它並將其存儲在數組中。

下一次該數組有一個值,所以使用,而不必計算。

+0

那麼我應該把計算代碼放在哪裏?由於這個函數只會在表視圖重載數據時執行,所以緩存技術可能沒有那麼有用。 –

0

你如何設置/獲取self.tmpCell?您是否將可重複使用的單元保存在一個屬性中?

改爲從單元格獲取文本並計算大小,可以計算單元格數據源中文本的大小。我的意思是你以某種方式設置cellForRowAtIndexPath:中的文本(例如,從一個數組中)只需使用它的文本來計算它。

對於幀:該細胞具有的tableview 的相同的寬度對於字體:剛寫一個稱爲

- (UIFont *)fontForCellAtIndexPath:(NSIndexPath *)indexpath 

方法,並且還使用它從cellForRowAtIndexPath。如果稍後更改文本的字體,它會使您的工作更輕鬆。

+0

self.tmpCell只會在第一次被'if(self.tmpCell == nil)'初始化。 –

+0

你不只有一個單元格,對吧?你只需將一些單元格保存在一個屬性中。實際上,你無法知道iOS何時調用了你的heightForRowAtIndexPath方法,但你已經獲得了indexPath。 Tableview可以同時擁有更多的單元格,但只保存一個單元格。我更新了我的答案 – Mert

1

因爲您正在從服務器上傳輸數據,所以無論如何你都會有延遲。

=>我建議你做的身高在後臺計算bevor重新加載表/刪除微調等

// Method you call when your data is fetched 
- (void)didReciveMyData:(NSArray *)dataArray { 
    // start background job 
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 
     self.myCachedHeightArray = [[NSMutableArray alloc] initWithCapacity:[dataArray count]]; 
     int i = 0; 
     for (id data in dataArray) { 
      float height; 

      // do height calculation 

      self.myCachedHeightArray[i] = [NSNumber numberWithFloat:height];// assign result to height results 
      i++; 
     } 

     // reload your view on mainthread 
     dispatch_async(dispatch_get_main_queue(), ^{ 
      [self doActualReload]; 
     }); 
    }); 
} 

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { 
    return [[self.myCachedHeightArray objectAtIndex:indexPath.row] floatValue]; 
} 
1

我要把它放到我平時自定義單元格子......這樣的代碼沒有按」 t使我的控制器混亂,並且對於我使用的單元是正確的。 (+它更適合MVC這種方式......單元格的高度是一個視圖屬性IMO)

I不要測量每個單元格,但使用靜態方法 - 請參閱https://github.com/Daij-Djan/TwitterSearchExampleApp(ViewController和DDTweetTableViewCell類舉個例子)

+0

感謝您的示例 –

相關問題