UILabel-适合文本的自动大小标签?

是否可以自动调整 UILabel 框/边界的大小以适应所包含的文本? (我不在乎它最终是否会比展品大)

因此,如果用户输入“ hello”或“ my name is really long i want it to fit in this box”,它将永远不会被截断,标签也会相应地“扩大”?

254227 次浏览

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

或者看看这篇文章: 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。


IOS6更新

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


IOS8更新

不推荐使用 sizeWithFont:,因此改用 sizeWithAttributes::

- (float)expectedWidth{
[self setNumberOfLines:1];


CGSize expectedLabelSize = [[self text] sizeWithAttributes:@{NSFontAttributeName:self.font}];


return expectedLabelSize.width;
}
@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 的高度。

根据上面丹尼尔的回答,我创建了一些方法。

-(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];
}

使用 [label sizeToFit];将达到相同的结果从丹尼尔斯类。

尽管我建议使用自动布局,并让标签根据约束自行调整大小。

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

还有一种方法:

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

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

  1. 适用于 iOS7.0及以上版本

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

before iOS 7.0 this could be used to calculate label size

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

//基于 labelTextHeight 重新设置其他控件

CGFloat labelTextHeight = labelTextSize.height;
  1. 如果不想计算标签文本的大小,可以在 UILabel 实例上使用-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
    

// after this you can get the label frame to reframe other related controls

如果我们想要的 UILabel应该收缩和扩大基于文本大小,然后故事板与自动布局是最好的选择。下面是实现这一目标的步骤

步骤

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

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

enter image description here

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

enter image description here

  1. 点击 Update Frame,点击 Fix Misplacement。现在,如果文本较少,这个 UILabel 将收缩,如果文本较多,则展开。
  1. 在故事板中添加缺少的约束。
  2. 在故事板中选择 UILabel 并将属性“ Line”设置为0。
  3. 用 id: label 将 UILabel 引用到 Controller.h
  4. M 并在 viewDidLoad 中添加 [label sizeToFit];

这并不像其他一些答案所说的那么复杂。

enter image description here

用大头针别住左边和上边

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

enter image description here

之后,它将自动调整大小。

笔记

  • 不要为宽度和高度添加约束。标签根据其文本内容有 内在的大小。
  • 感谢 这个答案的帮助。
  • 使用自动布局时不需要设置 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"
    }
    }
    
  • If you want your label to line wrap then set the number of lines to 0 in IB and add myLabel.preferredMaxLayoutWidth = 150 // or whatever in code. (I also pinned my button to the bottom of the label so that it would move down when the label height increased.)

enter image description here

  • If you are looking for dynamically sizing labels inside a UITableViewCell then see this answer.

enter image description here

我有一个巨大的问题,汽车布局。 我们有两个容器在表单元格内。第二个容器根据 Item 描述(0-1000个字符)调整大小,并且应该根据它们调整行的大小。

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

我已经将动态元素的底部约束从 = 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];

您可以显示一行输出,然后设置属性 直线 = 0和显示多行输出,然后设置属性 行 = 1以上

[self.yourLableName sizeToFit];

以下是我发现的适合我情况的方法:

使用自动布局,UILabel 的高度有 > = 0的限制,宽度是固定的。 2)将文本分配到 UILabel 中,这时 UILabel 已经有了一个超级视图(不确定这有多重要)。 3)然后,做:

    label.sizeToFit()
label.layoutIfNeeded()

现在可以适当地设置标签的高度。

SizeToFit ()方法不能很好地处理约束,但是从 iOS9开始,这就是您所需要的-

label.widthAnchor.constraint(equalToConstant: label.intrinsicContentSize.width).activate()