如何动态计算 UILabel 高度



我有以下代码:

label.numberOfLines = 0; // allows label to have as many lines as needed
label.text = @"some long text";
[label sizeToFit];

如何获取标签的高度(以磅为单位)?

获取高度的最简单方法是sizeThatFits 。像这样使用它:

目标-C

CGFloat maxLabelWidth = 100;
CGSize neededSize = [label sizeThatFits:CGSizeMake(maxLabelWidth, CGFLOAT_MAX)];

斯威夫特 3.0

let maxLabelWidth: CGFloat = 100
let neededSize = label.sizeThatFits(CGSize(width: maxLabelWidth, height: CGFloat.greatestFiniteMagnitude))

您的标签所需的高度是neededSize.height
请注意,im 使用 CGFLOAT_MAX 作为尺寸高度,以确保标签有足够的位置放入CGSize

标签的高度也取决于您的标签宽度,这就是我添加maxLabelWidth的原因,标签是否可以是 100pt 宽或 200pt 会有所不同。

希望这有帮助!

编辑:请确保label.numberOfLines = 0;否则neededSize返回文本在单行中的大小。

编辑:添加了 Swift 版本,虽然命名有点奇怪,但 greatestFiniteMagnitude 似乎是CGFLOAT_MAX的正确等价物。

使用以下方法计算动态 UILabel 高度:

- (CGFloat)getLabelHeight:(UILabel*)label
{
    CGSize constraint = CGSizeMake(label.frame.size.width, CGFLOAT_MAX);
    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;
}

只需使用 [label sizeThatFits:label.frame.size];,它将返回适合给定文本的标签大小。或者你也可以按照问题<</p>

div class="one_answers">

对于那些想要估计标签在UICollectionView或UITableView中估计页眉/单元格高度的方法中采用的大小的人,请遵循以下操作:

  1. 设置标签将采用的最大宽度
  2. 创建一个新的 UILabel 并将行数设置为 0
  3. 添加字体属性,如自定义字体名称和字体大小(如果使用自定义字体)
  4. 设置此标签的文本,并使用大小适合获取估计高度。标签高度为 neededHeight.height

迅捷

let maxLabelWidth:CGFloat = collectionView.frame.width - 20
let label = UILabel()
label.numberOfLines = 0
let addressFont = [ NSFontAttributeName: UIFont(name: "OpenSans", size: 12.0)! ]
let addr = "Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum."
label.attributedText = NSMutableAttributedString(string: addr , attributes: addressFont )
let neededSize:CGSize = label.sizeThatFits(CGSizeMake(maxLabelWidth, CGFloat.max))
let labelHeight = neededSize.height

感谢@FabioBerger

我稍微

编辑了萨尔曼·扎伊迪的回答,让它更好地为自己工作。如果您无法直接访问标签,例如当您尝试获取标签高度时,它会很好地工作heightForRowAtIndexPath:

-(CGFloat)getLabelHeight:(CGSize)labelSize string: (NSString *)string font: (UIFont *)font{
    CGSize size;
    NSStringDrawingContext *context = [[NSStringDrawingContext alloc] init];
    CGSize boundingBox = [string boundingRectWithSize:labelSize
                                                  options:NSStringDrawingUsesLineFragmentOrigin
                                               attributes:@{NSFontAttributeName:font}
                                                  context:context].size;
    size = CGSizeMake(ceil(boundingBox.width), ceil(boundingBox.height));
    return size.height;
}

您可以动态创建标签:

-(CGRect)newLableSize:(NSString *)lableString
{
     NSMutableParagraphStyle *paragraphStyle = [[NSMutableParagraphStyle alloc] init];
     [paragraphStyle setLineBreakMode:NSLineBreakByWordWrapping];
        CGFloat tempwidth = YourStaticLabelWidth * ScreenWidth / 320;
        NSMutableArray *array=[[NSMutableArray alloc]initWithObjects: lableString,nil];
       CGRect newLabelsize = [[array objectAtIndex:0] boundingRectWithSize:CGSizeMake(tempwidth, MAXFLOAT)  options:NSStringDrawingUsesLineFragmentOrigin attributes:@{NSFontAttributeName:selectFont,NSParagraphStyleAttributeName:paragraphStyle} context:nil];   
        NSLog(@"New Label Size Width  : %f",newLabelsize.size.width);
        NSLog(@"New Label Size Height : %f",newLabelsize.size.height);
        return newLabelsize;
}

我正在调整高度,label中有 2 行

lblUserQuestion.preferredMaxLayoutWidth = 100.0f;

100.0f,这是我想要的尺寸,还有另一行,

[lblUserQuestion sizeToFit];

我的方法完整是,

UILabel *lblUserQuestion = [[UILabel alloc] initWithFrame:CGRectMake(61, 25, self.frame.size.width-61-20, 37.0f)];
    lblUserQuestion.numberOfLines= 0;
    lblUserQuestion.font =[UIFont fontWithName:@"HelveticaNeue-Thin" size:14.];
lblUserQuestion.adjustsFontSizeToFitWidth = YES;
    lblUserQuestion.minimumScaleFactor = 0.5;
    lblUserQuestion.preferredMaxLayoutWidth= 100.0f;
    lblUserQuestion.text = _photoToVote.label; 
- (CGFloat)getTextHeightByWidth:(NSString*)text textFont:(UIFont*)textFont textWidth:(float)textWidth {
    if (!text) {
        return 0;
    }
    CGSize boundingSize = CGSizeMake(textWidth, CGFLOAT_MAX);
    NSAttributedString *attributedText = [[NSAttributedString alloc] initWithString:text attributes:@{ NSFontAttributeName: textFont }];
    CGRect rect = [attributedText boundingRectWithSize:boundingSize options:NSStringDrawingUsesLineFragmentOrigin context:nil];
    CGSize requiredSize = rect.size;
    return requiredSize.height;
}
- (CGFloat)getTextWidthByHeight:(NSString*)text textFont:(UIFont*)textFont textHeight:(float)textHeight {
    if (!text) {
        return 0.0f;
    }
    CGSize boundingSize = CGSizeMake(CGFLOAT_MAX, textHeight);
    NSAttributedString *attributedText = [[NSAttributedString alloc] initWithString:text
                                                                         attributes:@{ NSFontAttributeName: textFont }];
    CGRect rect = [attributedText boundingRectWithSize:boundingSize
                                               options:NSStringDrawingUsesLineFragmentOrigin
                                               context:nil];
    CGSize requiredSize = rect.size;
    return requiredSize.width;
}

使用此函数

+ (CGFloat)heightForText:(NSString*)text font:(UIFont*)font withinWidth:(CGFloat)width {
    CGSize constraint = CGSizeMake(width, 20000.0f);
    CGSize size;
    CGSize boundingBox = [text boundingRectWithSize:constraint
                                                  options:NSStringDrawingUsesLineFragmentOrigin
                                               attributes:@{NSFontAttributeName:font}
                                                  context:nil].size;
    size = CGSizeMake(ceil(boundingBox.width), ceil(boundingBox.height));
    return size.height;
}
 - (CGFloat)getLabelsize:(UILabel *)label
{
    CGSize maxSize = CGSizeMake(label.frame.size.width, 9999);
    CGSize requiredSize = [label sizeThatFits:maxSize];
    return requiredSize.height;
}

最新更新