UILabel – 自动大小的标签,以适应文本?

是否可以自动resize的UILabel框/界限以适应包含的文本? (我不在乎它是否比显示屏更大)

因此,如果用户input“hello”或“我的名字真的很长,我希望它能放在这个盒子里”,它永远不会被截断,标签也会相应地变宽。

请查看我的要点,我已经为UILabel做了一个非常类似的类别,我的类别让UILabel伸展它的高度来显示所有的内容: https : //gist.github.com/1005520

或者看看这个post: https : //stackoverflow.com/a/7242981/662605

这会拉高高度,但是你可以很容易地改变它,以另一种方式工作,并用这样的东西拉伸宽度,这是我相信你想要做的事情:

 @implementation UILabel (dynamicSizeMeWidth) - (void)resizeToStretch{ float width = [self expectedWidth]; CGRect newFrame = [self frame]; newFrame.size.width = width; [self setFrame:newFrame]; } - (float)expectedWidth{ [self setNumberOfLines:1]; CGSize maximumLabelSize = CGSizeMake(CGRectGetWidth(self.bounds), CGFLOAT_MAX); CGSize expectedLabelSize = [[self text] sizeWithFont:[self font] constrainedToSize:maximumLabelSize lineBreakMode:[self lineBreakMode]]; return expectedLabelSize.width; } @end 

你可以更简单地使用UIView类中的sizeToFit方法,但是将行数设置为1是安全的。


iOS 6更新

如果你正在使用AutoLayout,那么你有一个内置的解决scheme。 通过设置行数为0,框架将适当调整您的标签(增加更多的高度),以适应您的文本。

使用[label sizeToFit]; 将达到Daniels类别的同样结果。

虽然我build议使用自动布局,并让标签根据约束来调整自己的大小。

如果我们希望UILabel根据文字大小缩小和展开,那么使用自动布局的故事板是最好的select。 以下是实现这一目标的步骤

脚步

  1. 把UILabel放在视图控制器中,并把它放在任何你想要的地方。 也把UILabel numberOfLines属性UILabel 0

  2. 给它顶部,引导和尾部空间引脚约束。

在这里输入图像说明

  1. 现在它会发出警告,点击黄色箭头。

在这里输入图像说明

  1. 点击Update Frame ,然后点击Fix Misplacement 。 现在,如果文本较less,此UILabel将缩小,如果文本较多,则会展开。

这并不像其他一些答案那样复杂。

在这里输入图像说明

钉住左边和顶边

只需使用自动布局添加约束来钉住标签的左侧和顶侧。

在这里输入图像说明

之后,它会自动resize。

笔记

  • 不要为宽度和高度添加约束。 标签具有基于文本内容的固有尺寸。
  • 感谢这个答案帮助。
  • 使用自动布局时无需设置sizeToFit 。 我的示例项目的完整代码在这里:

     import UIKit class ViewController: UIViewController { @IBOutlet weak var myLabel: UILabel! @IBAction func changeTextButtonTapped(sender: UIButton) { myLabel.text = "my name is really long i want it to fit in this box" } } 
  • 如果你想让你的标签换行,那么在IB中设置行数为0,并添加myLabel.preferredMaxLayoutWidth = 150 // or whatever代码中的myLabel.preferredMaxLayoutWidth = 150 // or whatever 。 (我也将我的button固定在标签的底部,以便在标签高度增加时向下移动。)

在这里输入图像说明

  • 如果你正在寻找dynamic调整UITableViewCell标签,然后看到这个答案 。

在这里输入图像说明

使用[label sizeToFit]; 调整UILabel中的文本

我根据Daniel的回答在上面创build了一些方法。

 -(CGFloat)heightForLabel:(UILabel *)label withText:(NSString *)text { CGSize maximumLabelSize = CGSizeMake(290, FLT_MAX); CGSize expectedLabelSize = [text sizeWithFont:label.font constrainedToSize:maximumLabelSize lineBreakMode:label.lineBreakMode]; return expectedLabelSize.height; } -(void)resizeHeightToFitForLabel:(UILabel *)label { CGRect newFrame = label.frame; newFrame.size.height = [self heightForLabel:label withText:label.text]; label.frame = newFrame; } -(void)resizeHeightToFitForLabel:(UILabel *)label withText:(NSString *)text { label.text = text; [self resizeHeightToFitForLabel:label]; } 
 @implementation UILabel (UILabel_Auto) - (void)adjustHeight { if (self.text == nil) { self.frame = CGRectMake(self.frame.origin.x, self.frame.origin.y, self.bounds.size.width, 0); return; } CGSize aSize = self.bounds.size; CGSize tmpSize = CGRectInfinite.size; tmpSize.width = aSize.width; tmpSize = [self.text sizeWithFont:self.font constrainedToSize:tmpSize]; self.frame = CGRectMake(self.frame.origin.x, self.frame.origin.y, aSize.width, tmpSize.height); } @end 

这是类别方法。 您必须先设置文本,而不是调用此方法来调整UILabel的高度。

您可以使用两种方式根据文本和其他相关控件调整标签大小 –

  1. 对于iOS 7.0及以上版本

     CGSize labelTextSize = [labelText boundingRectWithSize:CGSizeMake(labelsWidth, MAXFLOAT) options:NSStringDrawingUsesLineFragmentOrigin attributes:@{ NSFontAttributeName : labelFont } context:nil].size; 

在iOS 7.0之前,这可以用来计算标签大小

 CGSize labelTextSize = [label.text sizeWithFont:label.font constrainedToSize:CGSizeMake(label.frame.size.width, MAXFLOAT) lineBreakMode:NSLineBreakByWordWrapping]; 

//根据labelTextHeight重构其他控件

 CGFloat labelTextHeight = labelTextSize.height; 
  1. 如果您不想计算标签文本的大小,则可以使用UILabel as-instance的实例上的-sizeToFit

     [label setNumberOfLines:0]; // for multiline label [label setText:@"label text to set"]; [label sizeToFit];// call this to fit size of the label according to text 

//在此之后,您可以获取标签框架来重新构build其他相关控件

  1. 在故事板中添加缺less的约束。
  2. 在故事板中selectUILabel并将属性“Line”设置为0。
  3. 使用id:label将UILabel输出到Controller.h
  4. Controller.m并添加[label sizeToFit]; 在viewDidLoad中

我有一个自动布局的巨大问题。 表格单元格内有两个容器。 第二个容器的大小取决于项目描述(0 – 1000个字符),行应根据它们resize。

缺less的成分是描述的底部约束。

我已经将dynamic元素的底部约束从= 0更改为> = 0

每次都适合! 🙂

  name.text = @"Hi this the text I want to fit to" UIFont * font = 14.0f; CGSize size = [name.text sizeWithAttributes:@{NSFontAttributeName: font}]; nameOfAssessment.frame = CGRectMake(400, 0, size.width, 44); nameOfAssessment.font = [UIFont systemFontOfSize:font]; 

你可以显示一行输出,然后设置属性Line = 0,并显示多行输出,然后设置属性Line = 1和更多

 [self.yourLableName sizeToFit]; 

也有这种方法:

 [self.myLabel changeTextWithAutoHeight:self.myStringToAssignToLabel width:180.0f];