Ios UILabel-自动调整标签大小以适应文本?

Ios UILabel-自动调整标签大小以适应文本?,ios,iphone,objective-c,uilabel,Ios,Iphone,Objective C,Uilabel,是否可以自动调整UILabel框/边界的大小以适应包含的文本? (我不在乎它是否比显示器大) 因此,如果用户输入“hello”或“我的名字很长,我希望它能放在这个框中”,它永远不会被截断,标签也会相应地“加宽”?请查看我的要点,我为UILabel做了一个分类,用于类似的东西,my category允许UILabel拉伸其高度以显示所有内容: 或者查看此帖子: 这会拉伸高度,但你可以很容易地改变它,以另一种方式工作,并通过类似的方式拉伸宽度,我相信这就是你想要做的: @implementation

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


因此,如果用户输入“hello”或“我的名字很长,我希望它能放在这个框中”,它永远不会被截断,标签也会相应地“加宽”?

请查看我的要点,我为
UILabel
做了一个分类,用于类似的东西,my category允许
UILabel
拉伸其高度以显示所有内容:

或者查看此帖子:

这会拉伸高度,但你可以很容易地改变它,以另一种方式工作,并通过类似的方式拉伸宽度,我相信这就是你想要做的:

@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更新 如果您使用的是自动布局,那么您有一个内置的解决方案。通过将行数设置为0,框架将适当调整标签大小(增加更多高度),以适合文本


iOS 8更新
sizeWithFont:
已被弃用,因此请改用
sizeWithAttributes:

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

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

    return expectedLabelSize.width;
}

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

我根据上面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];
}

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


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

使用
[label sizeToFit]
要调整UILabel中的文本,还有以下方法:

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

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

  • 适用于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
    

  • //在此之后,您可以让标签框架重新构造其他相关控件

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

    台阶
  • 将UILabel放置在视图控制器中,并将其放置在任何需要的位置。还为
    UILabel
    numberOfLines
    属性放置
    0

  • 为其提供顶部、前导和尾随空间接点约束

  • 现在它将发出警告,单击黄色箭头
  • 单击
    更新帧
    ,然后单击
    修复错位
    。现在,如果文本较少,此UILabel将缩小,如果文本较多,则会展开
  • 在情节提要中添加缺少的约束
  • 在情节提要中选择UILabel并将属性“Line”设置为0
  • Ref将UILabel输出到控制器.h,id:label
  • Controller.m并添加
    [label sizeToFit]在viewDidLoad中

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

    钉住左边缘和上边缘 只需使用“自动布局”添加约束即可固定标签的左侧和顶部

    之后,它将自动调整大小

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

    • 如果要在
      UITableViewCell
      中查找动态调整标签大小,请参阅

    我在自动布局方面遇到了很大的问题。 我们有两个容器在桌子的格子里。第二个容器的大小取决于项目描述(0-1000个字符),行的大小应该根据它们来调整

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

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

    每次都适合!)


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

    [self.yourLableName sizeToFit];
    

    以下是我发现对我的情况有效的方法:

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

        label.sizeToFit()
        label.layoutIfNeeded()
    

    标签的高度现在已适当设置。

    使用iOS 6自动布局方法,我无法摆脱标签上的高度限制。将高度约束的关系设置为“大于或等于”允许高度增长。当文本小于/大于时,ios 7UILabel中去除摩擦的sizeWithFont:constrainedToSize:lineBreakMode:方法不会调整自身大小。我使用自动布局。尝试制作UILabel,但每次初始化CellForRowatinex时都会创建UILabel。尝试了很多东西。对我来说没什么用。uilabel的背景采用相同的宽度。救命啊@Daniel我将行数设置为0,但它不起作用。我已经设置了水平和垂直中心的约束。我做的另一件事是创建UILABEL的子类,并将其用于LabelWith Autolayout最简单的解决方案是:(1)将线条设置为0,(2)将宽度约束设置为常数0的“大于或等于”,将高度约束设置为常数0的“大于或等于”,以及(4)按照通常的方式对齐,例如,将水平线居中
    [self.yourLableName sizeToFit];
    
        label.sizeToFit()
        label.layoutIfNeeded()