首页 文章

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

提问于
浏览
131

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

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

14 回答

  • 19

    请查看我的要点,我为 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是安全的 .


    iOS 6更新

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


    iOS 8更新

    sizeWithFont: 已弃用,请改为使用 sizeWithAttributes:

    - (float)expectedWidth{
        [self setNumberOfLines:1];
    
        CGSize expectedLabelSize = [[self text] sizeWithAttributes:@{NSFontAttributeName:self.font}];
    
        return expectedLabelSize.width;
    }
    
  • 69

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

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

  • 5

    如果我们希望 UILabel 应根据文本大小缩小和扩展,那么具有自动布局的故事板是最佳选择 . 以下是实现此目的的步骤

    步骤

    • 将UILabel置于视图控制器中并将其放置在您想要的任何位置 . 也将 0 用于 UILabelnumberOfLines 属性 .

    • 给它顶部,前导和尾随空间引脚约束 .

    enter image description here

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

    enter image description here

    • 单击 Update Frame 并单击 Fix Misplacement . 现在,如果文本较少,此UILabel将缩小,如果文本较多,则会展开 .
  • 9

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

    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

  • 1

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

  • 2

    我在上面根据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];
    }
    
  • 29
    @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的高度 .

  • 2

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

    • 适用于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实例上使用-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
    

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

  • -1
    • 在故事板中添加缺少的约束 .

    • 在故事板中选择UILabel并将属性"Line"设置为0 .

    • Ref使用id:label将UILabel Outlet转换为Controller.h

    • Controller.m并在viewDidLoad中添加 [label sizeToFit];

  • 1

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

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

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

  • 0

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

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

    label.sizeToFit()
        label.layoutIfNeeded()
    

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

  • 3

    适合每次! :)

    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

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

    [self.yourLableName sizeToFit];
    
  • 96

    还有这种方法:

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

相关问题