【问题标题】:UILabel - auto-size label to fit text?UILabel - 自动调整大小标签以适合文本?
【发布时间】:2012-02-06 11:40:04
【问题描述】:

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

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

【问题讨论】:

  • 任何人请帮我提供快速代码..

标签: ios iphone objective-c uilabel


【解决方案1】:

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

【讨论】:

  • 使用 iOS 6 AutoLayout 方法,我最终在我的标签上遇到了一个我无法摆脱的高度限制。将高度约束的关系设置为“大于或等于”允许高度增长。
  • sizeWithFont: constrainedToSize: lineBreakMode: ios 7 中弃用的方法
  • 当文本更少/更多时,UILabel 不会自行调整大小。我正在使用自动布局。尝试制作 UILabel 但它们是在每次初始化 cellForRowAtIndex 时创建的。尝试了很多东西。没有什么对我有用。 uilabel 的背景采用相同的宽度。救命!!!
  • @Daniel 我将行数设置为 0,但它不起作用。我已经设置了水平和垂直中心的约束。我做的另一件事是创建 UILABEL 的子类并将其用于该标签
  • 使用 Autolayout 最简单的解决方案:(1) 将 Lines 设置为 0,(2) 将宽度约束设置为“大于或等于”,常量 0,(3) 将高度约束设置为“大于or Equal" with Constant 0, (4) 像往常一样对齐,例如水平和垂直居中。
【解决方案2】:

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

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

【讨论】:

  • 使用 swift 时,我必须使用 dispatch_async(dispatch_get_main_queue(),{}) 在主线程上运行它;
  • @Zeezer 你知道为什么吗?
  • @FurloSK 对ui的任何更改都必须在主线程中完成。
【解决方案3】:

如果我们希望UILabel 根据文本大小收缩和扩展,那么带有自动布局的情节提要是最佳选择。以下是实现此目的的步骤

步骤

  1. 将 UILabel 放入视图控制器并放置在您想要的任何位置。还要将0 放入numberOfLinesUILabel 属性中。

  2. 给它顶部、前导和尾随空间引脚约束。

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

  1. 点击Update Frame,然后点击Fix Misplacement。现在,如果文本较少,此 UILabel 将缩小,如果文本较多,则扩展。

【讨论】:

  • 我还没有测试过本地化,但它也应该适用。
  • 在我取消选中“首选宽度”“显式”复选框之前,我无法让它与现有项目一起使用,然后一切正常。
【解决方案4】:

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

固定左边缘和上边缘

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

之后它会自动调整大小。

注意事项

  • 不要为宽度和高度添加约束。标签具有基于其文本内容的固有大小。
  • 感谢 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。 (我还将按钮固定在标签底部,以便在标签高度增加时它会向下移动。)

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

【讨论】:

  • 嗨,我得到了调整大小的标签,但我不明白如何调整单元格高度的大小。请告诉我如何调整单元格高度。
  • @Vivek,只要您没有对高度设置任何限制,它应该会自动调整大小。
  • 是的,但是当我使用自定义单元格并在他的单元格中放置 2 个标签时怎么可能。
  • @Vivek,对不起,我误读了你的问题。您是否已经通过this answer 获得了一个可以使用的标签?
【解决方案5】:

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

【讨论】:

    【解决方案6】:

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

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

        label.sizeToFit()
        label.layoutIfNeeded()
    

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

    【讨论】:

      【解决方案7】:

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

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

      【讨论】:

        【解决方案8】:
        @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的高度。

        【讨论】:

          【解决方案9】:

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

          1. 适用于 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;
          
          1. 如果您不想计算标签文本的大小,则可以在 UILabel as 的实例上使用 -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
            

          // 之后就可以获取标签框来重构其他相关控件了

          【讨论】:

            【解决方案10】:
            1. 在情节提要中添加缺失的约束。
            2. 在 storyboard 中选择 UILabel 并将属性“Line”设置为 0。
            3. 将 UILabel 引用到带有 id:label 的 Controller.h
            4. Controller.m 并在 viewDidLoad 中添加 [label sizeToFit];

            【讨论】:

              【解决方案11】:

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

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

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

              【讨论】:

              【解决方案12】:

              每次都适合! :)

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

              【讨论】:

                【解决方案13】:

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

                [self.yourLableName sizeToFit];
                

                【讨论】:

                  【解决方案14】:

                  还有这个办法:

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

                  【讨论】:

                  • 不是我否决了这个答案,但我只是想指出我在 UILabel 上看不到 changeTextWithAutoHeight:width: 方法。您能否提供一个链接到 UIKit 文档中可以找到此方法的位置。
                  猜你喜欢
                  • 1970-01-01
                  • 1970-01-01
                  • 2012-04-12
                  • 2017-01-07
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2014-05-04
                  • 1970-01-01
                  相关资源
                  最近更新 更多