如何计算文本所需的数字行

时间:2014-04-21 09:17:56

标签: objective-c uitableview

我知道这将是一个愚蠢的愚蠢的简单问题,但我会围成一圈。

我想要在uitableview中显示几个字符串。其中一些字符串非常长。我之前已经问过如何计算细胞高度,并选择以下答案:

- (CGFloat)cellHeightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    NSString *cellString = <YOUR MODEL OBJECT>;

    NSDictionary *attributes = @{ NSFontAttributeName : [UIFont systemFontOfSize:16.0f] };
    NSMutableAttributedString *attributedString = [[NSMutableAttributedString alloc]
                                               initWithString: cellString
                                               attributes:attributes];

    CGFloat width = self.tableView.frame.size.width - 32.0f;

    CGRect frame = [attributedString boundingRectWithSize:CGSizeMake(width, MAXFLOAT) options:NSStringDrawingUsesLineFragmentOrigin context:nil];

    // Add some extra padding to the height    
    CGFloat height = frame.size.height + 16.0f;

    return ceil(height);
}

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    return [self cellHeightForRowAtIndexPath:indexPath];
}

如何获得uitableview中显示字符串所需的行数。

1 个答案:

答案 0 :(得分:0)

实际计算单元格高度的最佳方法是使用原型单元格来计算高度。

在您的界面扩展程序中添加property

@interface TableViewController ()

@property (nonatomic, strong) TableViewCell *prototypeCell;

@end

然后懒洋洋地加载它:

- (TableViewCell *)prototypeCell
{
  if (!_prototypeCell)
  {
    _prototypeCell = [[TableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"Prototype"];
  }
  return _prototypeCell;
}

-[tableView:cellForRowAtIndexPath:]方法更改为使用-[configureCell:forRowAtIndexPath:]类型模式:

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    TableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"CellId" forIndexPath:indexPath];

    [self configureCell:cell forRowAtIndexPath:indexPath];

    return cell;
}

-(void)configureCell:(TableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
{
    // Set up you cell from your model
}

现在使用此方法设置原型,然后使用-[tableView:heightForRowAtIndexPath:]的高度:

-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
  [self configureCell:self.prototypeCell forRowAtIndexPath:indexPath];
  [self.prototypeCell layoutIfNeeded];

  CGSize size = [self.prototypeCell.contentView systemLayoutSizeFittingSize:UILayoutFittingCompressedSize];
  return ceil(size.height);
}