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

时间:2017-06-23 05:39:23

标签: ios objective-c uitableview tableviewcell

假设我有一个简单的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类中的layoutForSubViews

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

    但我的身高值仍然是错误的

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

  4. 唯一似乎有效的方法是覆盖单元格的drawRect并指定cornerRadius。这是唯一的方法吗?

4 个答案:

答案 0 :(得分:1)

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

但是适合的尺寸会导致布局错误。

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

答案 1 :(得分:0)

您可以在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;
}

答案 2 :(得分:0)

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

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

答案 3 :(得分:0)

要计算尺寸Subscriber,请使用此方法。

示例:

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; 设为CornerRadius