UILabel - 适合文字的自动尺寸标签?

时间:2012-01-09 23:56:43

标签: ios iphone objective-c uilabel

是否可以自动调整UILabel框/边界的大小以适应包含的文本? (我不在乎它是否比显示器更大)

因此,如果用户输入“hello”或“我的名字真的很长,我希望它适合此框”,那么它永远不会被截断,标签会相应地“加宽”吗?

13 个答案:

答案 0 :(得分:97)

请查看我的要点{I}为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

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


iOS 6更新

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


iOS 8更新

不推荐使用

sizeWithFont:,因此请改用sizeWithAttributes:

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

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

    return expectedLabelSize.width;
}

答案 1 :(得分:74)

使用[label sizeToFit];将获得与Daniels类别相同的结果。

虽然我建议使用autolayout并让标签根据约束自行调整大小。

答案 2 :(得分:22)

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

enter image description here

固定左边和上边

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

enter image description here

之后会自动调整大小。

注释

  • 不要为宽度和高度添加约束。标签具有基于其文本内容的内在大小。
  • 感谢this answer寻求帮助。
  • 使用自动布局时无需设置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。 (我还将我的按钮固定在标签底部,以便在标签高度增加时向下移动。)

enter image description here

  • 如果您要在UITableViewCell内查找动态调整标注大小,请参阅this answer

enter image description here

答案 3 :(得分:9)

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

答案 4 :(得分:5)

我根据Daniel的回复创建了一些方法。

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

答案 5 :(得分:3)

@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的高度。

答案 6 :(得分:2)

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

  1. 适用于iOS 7.0及以上版本

    CGSize labelTextSize = [labelText boundingRectWithSize:CGSizeMake(labelsWidth, MAXFLOAT)
                                              options:NSStringDrawingUsesLineFragmentOrigin
                                           attributes:@{
                                                        NSFontAttributeName : labelFont
                                                        }
                                              context:nil].size;
    
  2. 在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实例上使用-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
      
    2. //在此之后,您可以获取标签框以重新构建其他相关控件

答案 7 :(得分:2)

  1. 在故事板中添加缺少的约束。
  2. 在情节提要中选择UILabel,并将属性“Line”设置为0。
  3. 使用id:label
  4. 将UILabel转发到Controller.h
  5. Controller.m并在viewDidLoad
  6. 中添加[label sizeToFit];

答案 8 :(得分:2)

以下是我发现的适用于我的情况:

1)使用autolayout,UILabel的高度具有> = 0约束。宽度是固定的。 2)将文本分配到UILabel,UILabel在那时已经有一个超级视图(不确定它是多么重要)。 3)然后,做:

    label.sizeToFit()
    label.layoutIfNeeded()

现在可以正确设置标签的高度。

答案 9 :(得分:1)

我的自动布局存在很大问题。 我们在表格单元格中有两个容器。根据项目描述(0 - 1000个字符)调整第二个容器的大小,并根据它们调整行的大小。

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

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

答案 10 :(得分: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];

答案 11 :(得分:0)

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

[self.yourLableName sizeToFit];

答案 12 :(得分:-1)

还有这种方法:

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