2011-02-09 90 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,但表视图将立即收回他们,所以我不认为它应该是一个大问题。

相关问题