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。 以下是实现这一目标的步骤
脚步
-
把UILabel放在视图控制器中,并把它放在任何你想要的地方。 也把
UILabel
numberOfLines
属性UILabel
0
。 -
给它顶部,引导和尾部空间引脚约束。
- 现在它会发出警告,点击黄色箭头。
- 点击
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的高度。
您可以使用两种方式根据文本和其他相关控件调整标签大小 –
-
对于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;
-
如果您不想计算标签文本的大小,则可以使用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其他相关控件
- 在故事板中添加缺less的约束。
- 在故事板中selectUILabel并将属性“Line”设置为0。
- 使用id:label将UILabel输出到Controller.h
- 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];