iOS如何动态确定UILabel的大小

6

我正在尝试找出一种方法,以了解UILabel基于字符串和字体大小的大小,以便知道如何定义CGRect尺寸。

现在我有以下内容:

UILabel *myLabel = [[UILabel alloc] init];
myLabel.font = [UIFont fontWithName:@"BentonSansComp-Medium" size:50.0];
myLabel.text = @"This is a string example"  

问题是我没有可能的字符串列表,需要将标签居中显示,并且字符串不应该被截断(使用上面的例子:“This is a str....”)。有没有人知道如何根据字符串和字体大小确定UILabel的大小?非常感谢您的帮助。

请查看此问题:https://dev59.com/4GIk5IYBdhLWcg3wl_LE - paulonogueira
6个回答

7

只需使用

 UILabel *myLabel = [[UILabel alloc] init];
 myLabel.font = [UIFont fontWithName:@"BentonSansComp-Medium" size:50.0];
 myLabel.text = @"This is a string example" 
 [myLabel sizeToFit]; //it will resize the label to just the text is set
 CGRectMake size = myLabel.frame; // u will get the frame of the label once is resized
 float height = size.size.height;  //to get the height of the label
 float width = size.size.width;  //to get the width of the label

希望这能有所帮助。

每次更改文本时,请确保调用[myLabel sizeToFit];方法。


我尝试了你的代码,但是我得到的size.height和size.width都等于零。 - user2924482

1
我有同样的问题。计算许多UILabelUITextView的大小很昂贵,因此我想知道是否有比配置标签或文本视图然后询问其大小更便宜的方法。这在计算长表视图的行高时特别重要。
事实证明,确实有:UILabel似乎建立在UIKit的字符串添加上进行布局和绘制,而UITextView使用Text Kit(在iOS 7中)。可以配置这两个设施以使用相同的设置,并且比使用UIKit类计算字符串尺寸更便宜。
对于UILabel,我发现了以下内容:
CGFloat labelHeight = [testString boundingRectWithSize:(CGSize){ labelWidth, CGFLOAT_MAX }
                                               options:NSStringDrawingUsesLineFragmentOrigin
                                            attributes:@{ NSFontAttributeName : labelFont };
                                               context:nil].size.height;
labelHeight = ceil(labelHeight);

这里假设numberOfLines = 0。请注意需要将结果四舍五入。
我测试了上述代码,将约4000个字符串渲染成100种不同的宽度,所有结果都等于我用来比较的UILabel。
我也对UITextView的尺寸进行了计算,这更加复杂,需要设置NSLayoutManager。在这里,速度提升更为显著(比使用UITextView快了约50倍)。
如果有人感兴趣,这是代码和测试项目

0

我认为你需要的是多行,这将增加下方所需的区域。遵循这个方法,就不会再出现问题了。

myLabel.lineBreakMode = NSLineBreakByWordWrapping;
myLabel.numberOfLines = 0;

但仍需要知道UILabel的尺寸。 - user2924482

0
在iOS7中使用NSString方法boundingRectWithSize:options:context:。请查看此处的文档。
CGRect rectYouNeed =
  [myLabel.text boundingRectWithSize:CGSizeMake(100, CGFLOAT_MAX)
                             options:NSStringDrawingUsesLineFragmentOrigin
                             attributes:@{ NSFontAttributeName : myLabel.font }
                             context:nil];

0

请检查我的代码,我已经在我的一个应用程序中编写了它。

CGSize maximumLabelSize = CGSizeMake(270, FLT_MAX);
CGSize expectedLabelSize = [myString sizeWithFont:[UIFont fontWithName:@"Helvetica" size:16.0f] constrainedToSize:maximumLabelSize lineBreakMode:NSLineBreakByWordWrapping];

NSLog(@"Expected Size of label based on string--%@",NSStringFromCGSize(expectedLabelSize));
//adjust the label the the new height.
CGRect newFrame = myLabel.frame;//get initial frame of your label
newFrame.size.height = expectedLabelSize.height;
myLabel.frame = newFrame;
NSLog(@"new frame of label--%@",NSStringFromCGRect(newFrame));
[myLabel setText:attString];

sizeWithFont方法已经被弃用,boundingRectWithSize:options:attributes:context方法是更新后的替代方案。干杯! - Jim Tierney
谢谢,这段代码有点旧了。我大约一年前编写它来更新标签大小。 - Pawan Rai

0
您可以通过以下方式计算标签的宽度:
[@"STRING" sizeWithFont:[UIFont fontWithName:@"FONT" size:12] forWidth:200 lineBreakMode:NSLineBreakByWordWrapping];

否则,您可以将字符串设置在标签中,然后调用sizeToFit,这将根据文本设置标签的frame

返回一个 CGSize 对象,该对象表示使用指定字体在给定宽度下绘制文本时所需的大小,使用指定的换行模式。此方法已弃用,请改用 -boundingRectWithSize:options:attributes:context:方法。 NS_DEPRECATED_IOS(2_0,7_0,“使用-boundingRectWithSize:options:attributes:context:”); - user2924482

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接