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

way*_*neh 143 iphone objective-c uilabel ios

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

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

Dan*_*iel 97

请查看我的要点,我已经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
Run Code Online (Sandbox Code Playgroud)

您可以更简单地使用类中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;
}
Run Code Online (Sandbox Code Playgroud)

  • 使用iOS 6 AutoLayout方法我最终在我的标签上有一个高度限制我无法摆脱.将高度约束的关系设置为"大于或等于"允许高度增长. (8认同)
  • sizeWithFont:constrainedToSize:lineBreakMode:在ios 7中描述的方法 (2认同)

Gui*_*tro 75

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

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

  • @FurloSK ui上的任何更改都必须在主线程中完成. (12认同)
  • 当使用swift时,我必须使用dispatch_async(dispatch_get_main_queue(),{})在主线程上运行它; (3认同)

Yog*_*har 33

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

脚步

  1. 将UILabel放入视图控制器并将其放在任何您想要的位置.也0适用numberOfLinesUILabel.

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

在此输入图像描述

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

在此输入图像描述

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

  • 在取消选中"首选宽度""明确"复选框之前,我无法使用现有项目,然后一切正常. (2认同)

Sur*_*gch 22

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

在此输入图像描述

固定左边和上边

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

在此输入图像描述

之后它会自动调整大小.

笔记

  • 不要为宽度和高度添加约束.标签具有基于其文本内容的固有大小.
  • 感谢这个答案的帮助.
  • 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"
        }
    }
    
    Run Code Online (Sandbox Code Playgroud)
  • 如果您希望标签换行,则在IB中将行数设置为0并添加myLabel.preferredMaxLayoutWidth = 150 // or whatever代码.(我还将我的按钮固定在标签的底部,这样当标签高度增加时它会向下移动.)

在此输入图像描述

  • 如果您正在寻找动态调整标签内部的标签,UITableViewCell请参阅此答案.

在此输入图像描述


Gau*_*ani 9

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


Chr*_*nce 6

这是我发现适合我的情况的内容:

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

    label.sizeToFit()
    label.layoutIfNeeded()
Run Code Online (Sandbox Code Playgroud)

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


小智 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];
}
Run Code Online (Sandbox Code Playgroud)