如何在iOS中创建多行表格单元格?

时间:2011-02-09 23:16:42

标签: ios ios4 uitableview

如何让第二个单元格扩展以适应文本而不是缩放文本?在iOS中是否有内置的方法,或者我必须提出一些自制的解决方案?如果你查看iOS联系人应用程序,就会有一个类似于此框的地址。我找不到如何实现这一点。

Table screenshot


对于那些希望将来实现这一目标的人来说,这是我解决方案的代码:

HEADER文件:

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

IMPLEMENTATION文件:

- (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;
}

以下是结果的屏幕截图:

UITableView fixed

4 个答案:

答案 0 :(得分:5)

不幸的是,您必须自己实现此功能。您需要使用各种方法和回调来计算行和标签的高度。如果您需要一些帮助入门,我可以修改此答案以包含一些示例代码。否则,我确定SO或Google上有一些相关问题可以帮助您入门。但总而言之:

  • 确定UITableViewDelegate方法-tableView:heightForRowAtIndexPath:中行的高度。您可能需要使用NSString UIKit Addition methods来计算字符串与给定字体大小等的高度等。从此委托方法中返回正确的高度。
  • 确保您的标签(在IB中或以编程方式配置)设置为使用多行。如果将numberOfLines设置为0,则标签将根据需要使用尽可能多的行。
  • UITableViewDataSource的{​​{1}}实施中,您需要使用与以前相同的逻辑来确定标签的框架。设置所需的文本,然后更改框架,使标签足够高,几乎不适合所有文本。

答案 1 :(得分:1)

实施:

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

在你的表委托中。对于传递的indexPath中的不同行和节,返回不同的高度以适合您的标签。

确保未标记IB中标签的“调整以适合”(如果使用代码完成,则为属性adjustsFontSizeToFitWidth。)

答案 2 :(得分:1)

如果您将地址作为detailTextLabel,请使用支持尽可能多行的UILabel,对于地址,3应该足够。加上Paul Bently's回答,你应该很高兴。

答案 3 :(得分: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分配,但表视图将立即回收它们,所以我认为它不应该是一个大问题。