0

我正在使用以下方法实现来计算UITableViewCell包含多行文本的 a 的高度:

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
  if (indexPath.section == 1 && indexPath.row == 1) {
    NSDictionary *fields = self.messageDetailsDictionary[@"fields"];
    NSString *cellText = fields[@"message_detail"];
    UIFont *cellFont = [UIFont systemFontOfSize:14.0];
    CGSize constraintSize = CGSizeMake(250.0f, MAXFLOAT);
    CGSize labelSize = [cellText sizeWithFont:cellFont constrainedToSize:constraintSize lineBreakMode:NSLineBreakByWordWrapping];

    return labelSize.height + 20;

  } else {

    return tableView.rowHeight;  

  }

}

为了完整起见,这里是cellForRowAtIndexPath该单元格的条目:

  UITableViewCell *cell = [[UITableViewCell new] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"DetailCell"];
  if (cell == nil) {
    cell = [[UITableViewCell new] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"DetailCell"];
  }
  cell.textLabel.lineBreakMode = NSLineBreakByWordWrapping;
  cell.textLabel.font = [UIFont systemFontOfSize:14.0];
  NSDictionary *fields = self.messageDetailsDictionary[@"fields"];
  cell.textLabel.numberOfLines = 0; // This means multiline
  cell.textLabel.text = fields[@"message_detail"];

  return cell;

位于UITableViewCellGroupedUITableView中,这很重要,因为它会影响单元格的宽度。

这在某种程度上是有效的,它确实计算了一个足够大的单元格高度以容纳正在输入的文本,但它似乎有点太大了,因为单元格的顶部和底部有太多的空间。这取决于文本的数量,所以我认为它与return labelSize.height + 20;语句无关。我怀疑这取决于我使用的“250.0f”值,CGSizeMake但我不知道正确的值应该是什么。

最终我想要的是有一个单元格,在任何内容大小的文本上方和下方都有一致的填充。

任何人都可以帮忙吗?

4

1 回答 1

0

通过消除过程,结果证明幻数是 270.0f。tableView框架的宽度可以从self.tableView.frame.size.width中获取。这是 320.0f,从中取 50.0f(等于 270.0f)似乎会产生一致的结果。

所以方法应该如下:

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

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

    NSDictionary *fields = self.messageDetailsDictionary[@"fields"];
    NSString *cellText = fields[@"message_detail"];
    UIFont *cellFont = [UIFont systemFontOfSize:14.0];
    CGSize constraintSize = CGSizeMake(self.tableView.frame.size.width - 50.0f, MAXFLOAT);
    CGSize labelSize = [cellText sizeWithFont:cellFont constrainedToSize:constraintSize lineBreakMode:NSLineBreakByWordWrapping];

    return labelSize.height + 20.0f;

  } else {

    return tableView.rowHeight;  

  }

}

我不确定为什么 50.0f 是正确的值,因为我不确定 50.0f 中有多少是从单元格边框到 tableView 边缘的距离以及有多少是单元格本身的内部填充但是除非您修改了这两个值中的任何一个,否则它会起作用。

于 2013-02-13T08:32:19.470 回答