2012-05-02 221 views
4

使用故事板,我爲我的表格視圖創建了一個自定義單元格,並且還爲我的所有屬性創建了一個自定義類別。動態表格單元格高度

現在,將單元格高度變爲動態的最佳方式是什麼?最好的方法是在哪裏進行? 我應該在單元格的自定義類中執行此操作嗎?或者在我的表格視圖控制器?

我想在自定義類中這樣做會更有意義,但是我應該怎麼做? 一旦一個特定的標籤填充,它應該改變細胞的高度

回答

5

您不能從自定義繪圖類中更改單元格的高度。

您可以在僅具有UITableView的viewController中執行此操作。 通過指定所有單元的硬編碼的行高度,或通過使用

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

並指定這裏的細胞的高度。 如果要爲單元格設置不同的高度,則應檢查indexpath.row屬性並返回所需的高度值。

如果你想改變的屏幕細胞已經繪製的高度,你將不得不重新加載細胞以此來反映這種變化:

- (void)reloadRowsAtIndexPaths:(NSArray *)indexPaths withRowAnimation:(UITableViewRowAnimation)animation

+0

謝謝,我似乎可以手動設置高度,但是何時調用這個函數?我有幾個標籤,並且高度應該相應地改變,當我輸出其中一個標籤的文本時,它看起來是空的 –

+0

如果更改可見單元格的高度,則需要重新加載行以實際強制UITableView調用委託cellForRowAtIndexPath爲每個可見單元格,這意味着基本上它會重繪可見單元格。所以你應該相應地調整你的標籤高度。如果您正在使用自定義繪製代碼,請記住您必須調用setNeedsDisplay方法來強制您的自定義繪製類的drawRect重新加載。 – Lefteris

+0

我設法讓它與reloadRowsAtIndexPath一起工作,謝謝! –

0

設置你的視圖控制器是表視圖的委託,然後實現在視圖控制器下面的UITableViewDelegate方法:

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

從我所看到的是,這將使用我的故事板給,我用[cell.descriptionLabel sizeToFit]高度,但它似乎沒有使用這個新的高度 –

4

使用下面的代碼

-(CGFloat)heightForText:(NSString *)str width:(int)width font:(UIFont *)font lineBreakMode:(NSLineBreakMode) lineBreakMode 
{ 
    CGSize textSize; 
    textSize = [str boundingRectWithSize:CGSizeMake(width, FLT_MAX) options:NSStringDrawingUsesLineFragmentOrigin attributes:@{NSFontAttributeName : font} context:nil].size; 
    return textSize.height; 
} 
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    if(tableView == self.yourTable) 
    { 
      NSMutableDictionary *dict = [self.yourArray objectAtIndex:indexPath.row] ; 
      return [self heightForText:[dict valueForKey:@"reviewDescription"] width:300 font:[UIFont fontWithName:kAppRegularFont size:15.0] lineBreakMode:0]+75; 
    } 
    return 70; 
} 
0

添加這些行到你的 「viewDidLoad中」 方法

self.tableView.estimatedRowHeight = your height here 

self.tableView.rowHeight = UITableViewAutomaticDimension; 

不要設置默認HIGHT到委託

func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { 

} 
+1

你應該使用代碼語法來格式化你的文章! (canoot編輯,隊列已滿):/ – MTroy