如何获取 UITableViewCell 中标签的高度?

How to get height of label inside UITableViewCell?

假设我有一个简单的 tableViewCell,只有一个视图 (UILabel),tableView 有 10 行,不同位置的 label 的文本从 1到 3 行,现在 cellForRowAtIndexPath

cellForRowAtIndexPath{
  [MyCell* cell = _tableView.dequeueReusableCellWithIdentifier:@"MyCell"];
  cell.label.text = [stringArray objectAtIndex:indexPath.row];
}

现在我想将 cornerRadius 添加到与该标签高度成比例的 label(比如角半径是标签高度的一半)

label.layer.cornerRadius = label.frame.size.height/2;

现在我的问题是我在哪里可以为标签设置这个角半径?

  1. 我尝试在 cellForRowAtIndexPath 中设置,但我得到的高度值不正确
  2. 我试图像这样覆盖 MyCell class 中的 layoutForSubViews

    -(void)layoutSubviews{
      [super layoutSubviews];
       self.label.layer.cornerRadius = self.label.frame.size.height/2;
    }
    

    但我仍然得到错误的身高值

  3. 我尝试在 -willDisplayCell 从 tableView 回调时执行此操作,但高度仍然错误

唯一似乎有效的方法是覆盖单元格的 drawRect 并分配 cornerRadius。这是唯一的方法吗?

您也可以尝试使用 [cell.label sizeToFit]; 并在此之后访问框架,例如在 cellForRowAtIndex 路径中。

但是大小不合适会导致布局错误。

此外,@DSDharma 注释应该很有用,但您需要在 UITableViewCell 子类中重写 - (void) layoutSubviews。那应该有效。

您可以在 sizeForItemAtIndexPath 中获取 UITableViewCell 标签的正确高度。

使用下面的代码

- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath {

    NSMutableDictionary *currentObject = [yourMutableArray objectAtIndex:indexPath.row];

    NSString *datum = [currentObject valueForKey:@"yourKeyName"];

    CGSize size = [datum boundingRectWithSize:CGSizeMake(self.view.bounds.size.width, CGFLOAT_MAX) options:NSStringDrawingUsesLineFragmentOrigin attributes:@{NSFontAttributeName: [UIFont fontWithName:@"yourFontFamily" size:16]} context:nil].size;

    return size;
}

使用下面的代码获取标签高度。

- (CGFloat)getLabelHeight:(UILabel*)label
{
    CGSize constraint = CGSizeMake(label.frame.size.width, 999);
    CGSize size;
    NSStringDrawingContext *context = [[NSStringDrawingContext alloc] init];
    CGSize boundingBox = [label.text boundingRectWithSize:constraint
                                                  options:NSStringDrawingUsesLineFragmentOrigin
                                               attributes:@{NSFontAttributeName:label.font}
                                                  context:context].size;
    size = CGSizeMake(ceil(boundingBox.width), ceil(boundingBox.height));
    return size.height;
}

要计算大小 sizeWithFont constrainedToSize:lineBreakMode: 使用此方法。

示例:

// FLT_MAX here simply means no constraint in height
CGSize maximumLabelSize = CGSizeMake(296, FLT_MAX);

CGSize expectedLabelSize = [yourString sizeWithFont:yourLabel.font constrainedToSize:maximumLabelSize lineBreakMode:yourLabel.lineBreakMode];   

//update label with new Height
CGRect newFrame = yourLabel.frame;
newFrame.size.height = expectedLabelSize.height;
yourLabel.frame = newFrame;

并设置 CornerRadiusnewFrame