2013-01-22 152 views
8

我有一些問題在UITableView中實現動態行高 - 但它不是我遇到問題的單元格,它在單元格內的UILabel。UILabel在動態高度的UITableViewCell中

該單元格只包含一個UILabel來顯示文本。我的tableView:heightForRowAtIndexPath:通過使用NSString的sizeWithFont:方法計算標籤的高度,正確調整每個單元格的大小。

我有一個UITableViewCell的子類,它只保存故事板中的UILabel屬性。在故事板中,我將它的行設置爲0,因此它將使用盡可能多的行,並且我已將其lineBreak設置爲Word Wrap。

下面是我如何設置單元格:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    ExpandCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell" forIndexPath:indexPath]; 

    SomeObject *object = self.tableObjects[index.row]; 

    cell.myLabel.text = [object cellText]; 

    [cell.myLabel sizeToFit]; 

    return cell; 
} 

當我建立這個,我得到了小區的所有大小以正確的高度爲他們的內容我的表視圖,但唱片公司都1條線就是從單元的邊上跑下來的。但是,如果我滾動表格以便單元離開屏幕,然後回滾到它們,它們的標籤將正確調整大小,單元格將顯示我最初的預期。

我也嘗試用相同的方法計算標籤框架,我正在計算行高度,並且我得到相同的行爲 - 直到它從屏幕滾動並再次返回時,它才能正確繪製。

我發現瞭解決這個問題的兩種方法,但都不是可接受的解決方案。

首先,如果在viewDidAppear:我在我的tableview調用reloadData,單元格和標籤第一次正確繪製自己。這對我的情況不起作用,因爲我將在此表中添加和刪除單元格,並且每次添加單元格時我都不想調用reloadData。

第二種解決方法對我來說似乎很奇怪 - 如果我將字體設置保留在UILabel上的默認系統字體17上,那麼單元格會正確繪製自己。只要我改變字體大小,它就會恢復到它沒有正確繪製標籤直到它離開屏幕並返回,或者在tableView上調用reloadData爲止的行爲。

我會很感激任何幫助這一個。

+0

這個帖子正確回答您的問題:http://stackoverflow.com/questions/8903369/dynamic- UITableViewCell的高度。如果您以前從未創建過動態大小的單元格,但可能有點棘手,但並不太難。 – macandyp

+0

我不明白該答案中的代碼如何做與我正在做的不同的事情。我在cellForRowAtIndexPath中設置標籤的框架,但它不會在下一次重畫時應用該框架。或者我錯過了什麼? – alivingston

+0

您是否正在實施heightForRowAtIndexPath? – macandyp

回答

8

我最終通過alloc/init'ing cellForRowAtIndexPath中的標籤來解決這個問題。我不完全確定爲什麼這是一個解決方案 - 但看起來我遇到的問題與故事板(或者什麼時候,也許?)如何在單元格內創建對象有關。如果我在cellForRowAtIndexPath中的單元格中分配/初始化標籤,則所有內容都會正確加載和大小。

所以......我目前的解決方法是檢查單元格是否有我的自定義標籤。如果沒有,我分配/初始化標籤並將其放入單元格中。如果它有一個,就像它已經出隊的一個單元格一樣,那麼我只需在已經存在的標籤中設置文本。

不知道它是否是最好的解決方案,但現在它的工作。

+0

我遇到過類似的問題。我通過從tableView:cellForRowAtIndexPath:中除去[cell.myLabel sizeToFit]來解決它。然後使用故事板,將頂部空間添加到Superview,將底部空間添加到Superview。 – jemeshsu

+0

你節省了我的時間。謝謝 – NightFury

3

我最終通過取消選中IB中的自動調整複選框來解決此問題。目前還不清楚爲什麼自動佈局導致這個問題。

2

我跑過去同樣的問題,我最終被返回之前調用[cell layoutIfNeeded]細胞解決它

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 
ExpandCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell" forIndexPath:indexPath]; 
SomeObject *object = self.tableObjects[index.row]; 

cell.myLabel.text = [object cellText]; 

[cell layoutIfNeeded]; 

return cell; }