根据内容调整 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 大小的主要内容,如果未能解决你的问题,请参考以下文章
根据 JSON 文件中的内容文本调整带有 UILabel 的自定义单元格的大小