iOS 7:获取默认UITableViewCell的高度?

时间:2014-02-01 20:49:54

标签: ios uitableview

我正在使用默认的UITableViewCell,只是它的textLabel。我的文字是多行的。计算高度的最佳方法是什么?

我知道有各种NSString大小调整方法,但为了使用它们,您必须指定宽度。而且我不知道默认textLabel的宽度,我怀疑它会根据放在其中的文本而改变。

我也试过使用这里描述的方法:

Using Auto Layout in UITableView for dynamic cell layouts & variable row heights

...但它不起作用(估计大小总是回来0);在该帖子中有一个暗示,该解决方案仅适用于UITableViewCell子类。 (我可以继承,但没有必要。)

连连呢?我的应用程序是iOS 7特定的。

谢谢!

3 个答案:

答案 0 :(得分:2)

UITableView rowHeight财产。如果您未明确设置,UITableView会将其设置为标准值。

答案 1 :(得分:2)

我使用标准的UITableViewCell - 使用你列出的问题中的github,但是替换这些函数。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil)
    {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
        cell.textLabel.lineBreakMode = UILineBreakModeWordWrap;
        cell.textLabel.numberOfLines = 0;
        cell.textLabel.font = [UIFont fontWithName:@"Helvetica" size:17.0];
    }

    // Configure the cell for this indexPath
    //[cell updateFonts];
    NSDictionary *dataSourceItem = [self.model.dataSource objectAtIndex:indexPath.row];
    cell.textLabel.text =[dataSourceItem valueForKey:@"body"];

    return  cell;
}

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    NSDictionary *dataSourceItem = [self.model.dataSource objectAtIndex:indexPath.row];
    NSString *cellText = [dataSourceItem valueForKey:@"body"];

    UIFont *cellFont = [UIFont fontWithName:@"Helvetica" size:17.0];
    CGSize constraintSize = CGSizeMake(280.0f, MAXFLOAT);
    CGSize labelSize = [cellText sizeWithFont:cellFont constrainedToSize:constraintSize lineBreakMode:UILineBreakModeWordWrap];

    return labelSize.height;
}

- (CGFloat)tableView:(UITableView *)tableView estimatedHeightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    if (self.isInsertingRow) {
        // A constraint exception will be thrown if the estimated row height for an inserted row is greater
        // than the actual height for that row. In order to work around this, we return the actual height
        // for the the row when inserting into the table view.
        // See: https://github.com/caoimghgin/TableViewCellWithAutoLayout/issues/6
        return [self tableView:tableView heightForRowAtIndexPath:indexPath];
    } else {
        return 500.0f;
    }
}

哦也删除了自定义单元类的寄存器,所以我们得到一个UITableViewCell而不是RJTableViewCell。我也想到这里(即使它是一个UITableViewCell)dequeueReusableCellWithIdentifier永远不会返回nil,我们也不会正确设置我们的单元格。

- (void)viewDidLoad
{
    [super viewDidLoad];

    //[self.tableView registerClass:[RJTableViewCell class] forCellReuseIdentifier:CellIdentifier];

    ...
}

此处基本上遵循此示例 - https://stackoverflow.com/questions/129502/how-do-i-wrap-text-in-a-uitableviewcell-without-a-custom-cell。我认为关键是不要像单元格子类那样向单元格询问它的高度,而是根据文本和字体来计算它。事实上,你无法向细胞询问它的高度似乎对我来说有点奇怪,让我觉得@Jeffery Thomas也许是对的,从长远来看,创建自定义细胞可能会更安全。可能取决于我猜的你的项目。

答案 2 :(得分:0)

您需要继承UITableViewCell

您要求UITableViewCell提供的内容超出其承诺提供的内容。这是一个麻烦的方法。

创建子类并构建原型。你会知道所有的约束,所以这很容易。