2012-08-17 63 views
1

首先,我所知道的,和經常使用的高度,有效地確定一個自定義變量大小的UITableViewCell

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

...這個問題是一個小比:-)更復雜

我有一個數據驅動的自定義UITableViewController。根據運行時表的定義,它會引入一系列自定義單元格(它們本身就是單獨的自定義UITableViewCell類)。

自定義單元格也是數據驅動的,並且具有僅在運行時確定的高度。

通過執行一些運行時日誌記錄,我看到UITableViewController在爲可見單元格調用cellFor ...之前調用表格中的所有單元格的heightFor ...。

這意味着我將有效地構建單元格以確定高度,然後在請求時再次返回單元格。

是否以任何方式通過heightFor返回高度的默認值,然後在實際高度已知時重寫此值?

或者有沒有其他解決方案可以避免構建細胞兩次?

建議感激。

回答

1

OK,所以這裏沒有很好的解決方案(即你不能改變的高度一旦它被創建,一個單元格)。

所以,我在這裏的解決方案是調用cellFor ... from heightFor ...,它構造單元格以獲得高度。然後我記錄該單元格的高度作爲屬性,並從高度獲得它...

獲得高度後,單元格會自動釋放(因爲它不會被保留)。當然,不久之後,UITableController會再次請求單元,所以它將被構造兩次,但這就是它的方式......

這是代碼,這很好。

-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    float height; 

    UITableViewCell <CMyTableViewDelegate> *cell = (UITableViewCell <MyTableViewDelegate> *) [self tableView:tableView cellForRowAtIndexPath:indexPath]; 

    height = [cell getHeight]; 

    return height; 
} 

希望能幫助別人。

+0

有趣的是,這個問題在Facebook應用程序本地重寫的博客條目中也提到過,http://www.macrumors.com/2012/08/24/engineers-detail-extensive-efforts-to-rewrite- Facebook的IOS-應用程序/ – Snips 2012-08-24 23:22:11

0

不,這是不可能的。再考慮解決方案。我會給你幾個指針。

  • 緩存計算的高度uitablebiewcell本身的
  • 檢查性能。也許它有太多的子視圖。
  • 預先計算的高度如果可能的話 - 前表視圖的數據源,讓你做這樣做,那麼返回緩存的高度