根据内容调整 UILabel 大小

Posted

技术标签:

【中文标题】根据内容调整 UILabel 大小【英文标题】:Resize UILabel based on content 【发布时间】:2011-08-30 11:44:50 【问题描述】:

我有一个UILabel,他的文字大小有属性

title.adjustsFontSizeToFitWidth = YES;

这使我无法使用标准方法来调整 UILabel 的大小。我在这里的另一篇文章中读到我应该使用该功能

sizeWithFont:minFontSize:actualFontSize:forWidth:lineBreakMode

来自这个答案:How to figure out the font size of a UILabel when -adjustsFontSizeToFitWidth is set to YES?

现在,我不知道如何使它工作.. 这是实际的代码

UIFont *font = [UIFont fontWithName:@"Marker Felt" size:200];
UILabel *title = [[UILabel alloc] initWithFrame:CGRectMake(0.0, 0.0, width, 20.0)];
title.text = @"this is a long title that should be resized";
title.font = font;
title.numberOfLines = 1;
title.adjustsFontSizeToFitWidth = YES;

CGFloat pointSize = 0.0;
CGSize size = [title.text sizeWithFont:font 
                           minFontSize:title.minimumFontSize 
                        actualFontSize:&pointSize 
                              forWidth:width 
                         lineBreakMode:title.lineBreakMode];
title.frame = CGRectMake(title.frame.origin.x, 
                         title.frame.origin.y, 
                         size.width, 
                         size.height);

UILabel 被错误地调整大小,好像字体大小仍然是 200.. 有什么线索吗?谢谢!

【问题讨论】:

什么是title.minimumFontSize? width 变量中有什么值? 目前没有设置 minimumFontSize,width 就是我想要这个文本在的 UIView 的宽度(假设是 200.0) 尝试将其设置为 10,例如 =) 如果您有固定宽度,那么您想从尺寸中得到什么?身高? 是的,我正在尝试获取高度.. 基本上重点是模拟 uilabel 不支持的垂直顶部文本对齐 您是否尝试将 title.minimumFontSize 设置为低于 200 的值? 【参考方案1】:

我有一些你可以在我的 github 上使用的代码,检查一下,它是 UILabel 的一个类别,你需要设置框架宽度,当你可以在 UILabel 上 resizeToFit 时,它会调整高度以适应内容,并且返回标签末尾的 y 位置,以便您可以调整其后出现的任何内容。

https://gist.github.com/1005520

【讨论】:

尝试使用它,但我不确定.. 问题是我设置了框架宽度,我调用了 resizeToFit 并且它被调整了大小,但字体大小仍然是 200(所以文本被包裹起来多行)...我的意思是只获得一行填充视图的文本(字体大小根据字符串的长度而变化)..您的代码可以做到这一点吗? 不,我的代码用于多行标签,例如将框架设置为高度 0,您将提供文本和代码句柄来调整高度大小。在这种情况下,也许不是您要寻找的东西。对不起... 在我的工具文件中添加了 gist 最后评论【参考方案2】:

我建议将此作为错误提交。

-sizeWithFont:minFontSize:actualFontSize:forWidth:lineBreakMode:返回的大小有正确的宽度,但不是高度不考虑实际字体大小。

UILabel 似乎也有这个错误。将标签的大小更改为与 -sizeWithFont:minFontSize:actualFontSize:forWidth:lineBreakMode: 返回的字体中的文本高度相匹配,将错误地垂直定位标签内的文本。

解决方法是计算正确的高度,并将标签上的字体更改为实际字体大小:

CGFloat pointSize = 0.0f;
CGRect frame = title.frame;
frame.size = [title.text sizeWithFont:font
                          minFontSize:title.minimumFontSize
                       actualFontSize:&pointSize
                             forWidth:width
                        lineBreakMode:title.lineBreakMode];
UIFont *actualFont = [UIFont fontWithName:@"Marker Felt" size:pointSize];
CGSize sizeWithCorrectHeight = [title.text sizeWithFont:actualFont];
frame.size.height = sizeWithCorrectHeight.height;
title.frame = frame;
title.font = actualFont;

【讨论】:

sizeWithFont 已弃用【参考方案3】:

尝试使用较小的 fontSize 创建 font。例如:

UIFont *font = [UIFont fontWithName:@"Marker Felt" size:20];

但要 actualFontSize 将链接传递给 CGFloat == 200。

更新:

然后试试这个:

UIFont *font = [UIFont fontWithName:@"Marker Felt" size:20];
UILabel *title = [[UILabel alloc] initWithFrame:CGRectMake(0.0, 0.0, width, 20.0)];
title.text = @"this is a long title that should be resized";
title.font = font;
title.numberOfLines = 1;
title.adjustsFontSizeToFitWidth = YES;

CGFloat pointSize = 0.0;
CGSize size = [title.text sizeWithFont:font minFontSize:title.minimumFontSize actualFontSize:&pointSize forWidth:width lineBreakMode:title.lineBreakMode];
title.frame = CGRectMake(title.frame.origin.x, title.frame.origin.y, size.width, size.height);
font = [UIFont fontWithName:@"Marker Felt" size:200];
title.font = font;

【讨论】:

这样文本保持20pts! adjustsFontSizeToFitWidth 仅通过缩小 AFAIK 来工作。也没有读取实际字体大小,只是设置! 更新了我的答案。请尝试一下。将 20 替换为您的最小字体大小 这有点适用于特定情况......当由字体大小 20 创建的框架就足够了!我将发布我找到的解决方案,无论如何感谢您的帮助!编辑:不会发布它,与 lemnar 发布的非常相似:p【参考方案4】:
UILabel * label = [[UILabel alloc] init];
        [label setNumberOfLines:0];
        label.text=[detailDict valueForKey:@"method"];
        [label setFont:[UIFont fontWithName:@"Georgia" size:16.0]];
        CGSize labelsize=[label.text sizeWithFont:label.font constrainedToSize:CGSizeMake(250, 1000.0) lineBreakMode:UILineBreakModeWordWrap];
        int y=0;
        label.frame=CGRectMake(38, y, 245, labelsize.height);
        [label setBackgroundColor:[UIColor clearColor]];
        [label setTextColor:[UIColor whiteColor]];
        scrollView.showsVerticalScrollIndicator = NO;
        y+=labelsize.height;
        [scrollView setContentSize:CGSizeMake(200,y+50)];
        [scrollView addSubview:label];
        [label release];

我认为你应该使用这段代码,我正在使用滚动视图上的标签来显示大文本,你也可以这样做

【讨论】:

你能解释一下这应该如何与adjustsFontSizeToFitWidth一起工作吗?谢谢!【参考方案5】:

你试过intrinsicContentSize吗?

    myLable.numberOfLines = 0
    myLable.frame = CGRect(x: 10, y: 10, width: 300, height: lblSuperscript.intrinsicContentSize().height)

【讨论】:

以上是关于根据内容调整 UILabel 大小的主要内容,如果未能解决你的问题,请参考以下文章

UILabel 动态内容自动调整大小问题

UILabel 不会调整大小

根据 JSON 文件中的内容文本调整带有 UILabel 的自定义单元格的大小

以编程方式根据行数动态调整 UILabel 的大小

根据 UILabel 文本和图像自动调整单元格大小,例如聊天

如何根据 UILabel 动态调整 CollectionViewCell 的大小