2011-02-09 56 views
8

如何讓第二個單元格展開以適應文本而不是縮放文本?是否有內置的方式在iOS中執行此操作,或者我是否會想出一些自制解決方案?如果您在iOS聯繫人應用程序中查看,那麼地址中有一個類似的框。我找不到如何實現這個。如何在iOS中創建多行表格單元格?

Table screenshot


對於任何人都希望在未來實現這一目標,這裏是我的解決方案的代碼:

頭文件:

#define FONT_SIZE 22.0f 
#define CELL_CONTENT_WIDTH 320.0f 
#define CELL_CONTENT_MARGIN 5.0f 

實現文件:

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

    if (indexPath.section == 0 && indexPath.row == 1) { 

     NSString *text = [atmAnnotation address]; 

     CGSize constraint = CGSizeMake(CELL_CONTENT_WIDTH - (CELL_CONTENT_MARGIN * 2), 20000.0f); 

     CGSize size = [text sizeWithFont:[UIFont systemFontOfSize:FONT_SIZE] constrainedToSize:constraint lineBreakMode:UILineBreakModeWordWrap]; 
     NSLog(@"Size for address is Height:%f Width:%f",size.height,size.width); 

     CGFloat height = MAX(size.height, 44.0f); 

     return height + (CELL_CONTENT_MARGIN * 2); 

    } 
    return 44.0f; 
} 

這裏的結果的截圖:在你的表委託

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

UITableView fixed

回答

5

不幸的是,你將不得不自己實現這個功能。您需要使用各種方法和回調來計算行和標籤的高度。如果您需要一些幫助入門,我可以修改此答案以包含一些示例代碼。否則,我確定在SO或Google上有一些相關的問題可以幫助您入門。但總括而言:

  • 確定UITableViewDelegate方法-tableView:heightForRowAtIndexPath:中該行的高度。您可能需要使用NSString UIKit Addition methods來計算字符串對給定字體大小的高度等。從此委託方法返回適當的高度。
  • 確保您的標籤(以IB或以編程方式配置)設置爲使用多行。如果您將numberOfLines設置爲0,則標籤將根據需要使用盡可能多的行。
  • -tableView:cellForRowAtIndexPath:UITableViewDataSource執行中,您需要使用與以前相同的邏輯來確定標籤的框架。設置你想要的文字,然後改變框架,使標籤足夠高,以至於幾乎不適合所有文字。
1

實現。對於傳遞的indexPath中的不同行和部分,返回不同的高度以適合您的標籤。

確保「調整到適合」在IB的標籤未選中(財產adjustsFontSizeToFitWidth如果使用代碼完成)。

1

如果您的地址是detailTextLabel,那麼使用支持儘可能多的行的UILabel作爲地址,3就足夠了。與Paul Bently's一起回答,你應該很好去。

0

我只是碰到了同樣的問題。我發現了一種不需要太多硬編碼的替代解決方案,並且允許您修改Interface Builder中的標籤,該標籤將反映在高度計算中。

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    if (indexPath.section == 0 && indexPath.row == 1) { 
     NSString *text = [atmAnnotation address]; 
     UITableViewCell* cell = [tableView dequeueReusableCellWithIdentifier:@"MyIdentifier"]; 

     cell.textLabel.text = text; 
     [cell.textLabel sizeToFit]; 

     CGFloat height = MAX(44, cell.textLabel.bounds.size.height); 

     return height + CELL_CONTENT_MARGIN * 2; 
    } 

    return 44.0f; 
} 

唯一的缺點是,這將導致一些額外的臨時撥款的UITableViewCell,但表視圖將立即收回他們,所以我不認爲它應該是一個大問題。

相關問題