如何动态计算 UILabel 高度 [重复]

Posted

技术标签:

【中文标题】如何动态计算 UILabel 高度 [重复]【英文标题】:How do I calculate the UILabel height dynamically [duplicate] 【发布时间】:2014-12-09 08:44:31 【问题描述】:

我有以下代码:

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

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

【问题讨论】:

【参考方案1】:

获取高度的最简单方法是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。 请注意,我使用CGFLOAT_MAX 作为尺寸高度,以确保标签有足够的位置容纳CGSize

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

希望这会有所帮助!

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

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

【讨论】:

对我来说效果很好。 这个方法比我猜的接受的答案要好。 优秀。比公认的短而精。 @user1007522 是否将 numberOfLines 设置为 0 ? @user1007522 我猜你不知道,因为它肯定适用于 ios9,请阅读我的编辑。【参考方案2】:

使用以下方法计算动态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;

【讨论】:

UILabel alloc 是如何初始化的? 这对 NSMutableAttributedString 也有效吗? YES.. 将 label.text 更改为 label.attributedText 以调用 boundingRectWithSize 方法 就像一个魅力,只有一次编辑,如果你想使用属性文本,需要摆脱属性。 创建一个新的NSStringDrawingContext 有什么意义吗?【参考方案3】:

只需使用[label sizeThatFits:label.frame.size];,它将返回适合给定文本的标签大小。或者你也可以关注question

【讨论】:

对于 Swift4,我使用这个:label.sizeThatFits(label.frame.size).height 并且效果很好,numberOfLines 为 0【参考方案4】:

对于那些想要在 UICollectionView 或 UITableView 中估计标题/单元格高度的方法中估计标签大小的人,请遵循以下步骤:

    设置标签将采用的 maxWidth 创建一个新的 UILabel 并将 numberOfLines 设置为 0 如果使用自定义字体,则添加自定义字体名称和字体大小等字体属性 为此标签设置文本并使用 sizeThatFits 获取估计高度。标签高度为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

【讨论】:

【参考方案5】:

我稍微编辑了 Salman Zaidi 的答案,以使其更适合我自己。如果您无法直接访问标签,它会很好地工作,例如当您尝试在 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;

【讨论】:

【参考方案6】:

您可以动态创建标签:

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

【讨论】:

你能告诉我一件事,320 是静态值还是我们可以做它的动态值? 它的动态兄弟@KaushikMovaliya :) 你的意思是关于屏幕宽度或标签宽度?【参考方案7】:

我正在调整高度,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; 

【讨论】:

【参考方案8】:
- (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;

【讨论】:

【参考方案9】:

使用这个功能

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

【讨论】:

查看@Salman Zaidi 答案,请勿重复答案【参考方案10】:
 - (CGFloat)getLabelsize:(UILabel *)label

    CGSize maxSize = CGSizeMake(label.frame.size.width, 9999);
    CGSize requiredSize = [label sizeThatFits:maxSize];

    return requiredSize.height;

【讨论】:

以上是关于如何动态计算 UILabel 高度 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

旋转 UIL 标签辊

如何将 UIImage 设置为 UITableView Cell,它根据我在 UILabel 中输入的文本动态计算单元格高度?

如何将UIImage设置为UITableView Cell,根据我在UILabel中输入的文本动态计算单元格高度?

文本为空字符串时,自动布局UILabel的动态高度计算不起作用?

如何使动态高度 UILabel 将其他元素推开?

UITextView vs UILabel 高度计算