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

我怎样才能让第二个单元格展开,以适应文本,而不是缩放文本? 在iOS中是否有内置的方法,或者我必须想出一些家庭式的解决scheme? 如果您在iOS联系人应用程序中查找,那么地址就有这样一个框。 我找不到如何实现这个。

表格截图


对于将来要实现这一点的人来说,下面是我的解决scheme的代码:

HEADER文件:

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

以下是结果的截图:

UITableView固定

不幸的是,你将不得不自己实现这个function。 您需要使用各种方法和callback来计算行和标签的高度。 如果你需要一些帮助入门,我可以修改这个答案,包括一些示例代码。 否则,我确定在SO或Google上有一些相关的问题可以帮助您入门。 总之,但是:

  • 确定UITableViewDelegate方法-tableView:heightForRowAtIndexPath:的高度-tableView:heightForRowAtIndexPath: 您可能需要使用NSString UIKit添加方法来计算您的string与给定的字体大小有多高,等等。从这个委托方法返回适当的高度。
  • 确保您的标签(以IB或以编程方式configuration)设置为使用多行。 如果将numberOfLines设置为0,则标签将根据需要使用尽可能多的行。
  • -tableView:cellForRowAtIndexPath: UITableViewDataSource实现中,您需要使用与之前相同的逻辑来确定标签的框架。 设置你想要的文字,然后改变框架,使标签足够高,几乎不适合所有的文字。

在地址为detailTextLabel的地方,使用支持尽可能多行的UILabel作为地址,3就足够了。 再加上Paul Bently's答案,你应该很好走。

实行:

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

在你的表代表。 对于传递的indexPath中的不同行和部分,返回不同的高度以适应您的标签。

确保IB中标签的“调整到适合”不勾选(如果使用代码完成属性adjustsFontSizeToFitWidth )。

我遇到了同样的问题。 我发现了一个不需要太多硬编码的替代解决scheme,并且允许您对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分配,但表视图将立即回收它们,所以我不认为这应该是一个大问题。