2012-03-29 59 views
1

我想了解一個常見的正確的自定義單元格高度計算方法。
我的單元格是從筆尖加載的,它們有兩個多行UILabels,一個在另一個之上。
目前我在viewDidLoad中創建特殊配置單元格,並在heightForRowAtIndexPath中使用它。iOS正確的heightForRowAtIndexPath計算方式

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

    [self configureCell:self.configurationCell forIndexPath:indexPath]; 
    CGRect configFrame = self.configurationCell.frame; 
    configFrame.size.width = self.view.frame.size.width; 
    self.configurationCell.frame = configFrame; 

    [self.configurationCell layoutSubviews]; 

    UILabel *label = (UILabel *)[self.configurationCell viewWithTag:2]; 
    float height = label.frame.origin.y + label.frame.size.height + 10; 

    return height; 
} 

它的作品,但似乎是一個壞的方式。我認爲必須爲每個項目和每個方向預先計算高度。但是我無法找到一種讓它更好,更直接的方法。
你能幫我嗎?
單元格標籤的樣式(如字體和屏幕邊框的偏移量)必須從nib文件加載(單元格在nib內)。

新增的小區的layourSubviews方法:標籤

-(void) layoutSubviews { 

    [super layoutSubviews]; 

    [self.shortDescriptionLabel resize]; 

    CGRect longDescriptionFrame = self.longDescriptionLabel.frame; 
    longDescriptionFrame.origin.y = self.shortDescriptionLabel.frame.origin.y + self.shortDescriptionLabel.frame.size.height + 5; 
    self.longDescriptionLabel.frame = longDescriptionFrame; 

    [self.longDescriptionLabel resize]; 
} 

調整大小的方法簡單地增加了它的高度,以適合所有文本。所以單元格的高度計算爲longDescriptionLabel.bottom + 10.簡單的代碼,但不是很漂亮。

回答

1

看起來您正在嘗試在heightForRowAtIndexPath內部創建子視圖。視圖創作應該在cellForRowAtIndexPath中完成。

根據您的實施,您只能確定單元佈局後的高度。這是不好的,因爲對於每個單元,UITableView調用heightForRowAtIndexPath,而不是在數據重新加載時看到可見的。因此,即使不要求可見,也會創建所有單元格的子視圖。

爲了優化這個實現,你必須找出某種公式來確定高度,而不是佈置視圖。即使您的佈局是有彈性的或具有可變的高度,給定的文字矩形,仍然可以確定其高度。使用[NSString sizeWithFont:]來確定其顯示的矩形。將這些信息記錄在您的數據代表中。當調用heightForRowAtIndexPath時,直接返回。

+0

我沒有在heightForRowAtIndexPath中創建任何東西。我只是爲單元格視圖設置文本和調用佈局。這個配置單元在viewDidLoad的nib文件中創建一次。所以你錯了 - 在heightForRowAtIndexPath裏面沒有創建視圖。我想找出直接的方法來進行計算。在控制器中獲取單元格的字體大小和尺寸對我來說太複雜了。 – Division 2012-03-29 16:48:51

+0

那麼你沒有提供任何'layoutSubviews'的內容,所以對我來說這是一個黑匣子。儘管如此,我的建議仍然存在。你不應該在''heightForRowAtIndexPath''中做任何複雜的事情,因爲每行都會調用它。我正在討論在哪裏安排你的觀點的最佳選擇。如果你覺得它太複雜了,那麼你不需要這個優化。 – 2012-03-30 00:01:04

+0

我在我的文章中添加了layoutSubviews方法。如你所見,這並不複雜。我應該用高度預先計算來取代這個簡單的方法嗎? – Division 2012-03-30 08:15:45