一尘不染

在 UILabel 中将文本垂直对齐到顶部

javascript

我有UILabel两行文本的空间。有时,当文本太短时,该文本会显示在标签的垂直中心。

如何垂直对齐文本以始终位于顶部UILabel

表示带有垂直居中文本的 UILabel 的图像


阅读 165

收藏
2022-02-09

共1个答案

一尘不染

无法在 a 上设置垂直对齐UILabel,但您可以通过更改标签的框架来获得相同的效果。我已将标签设为橙色,以便您清楚地看到正在发生的事情。

这是执行此操作的快速简便的方法:

    [myLabel sizeToFit];

sizeToFit 挤压标签


如果您有一个带有较长文本的标签,该标签将超过一行,请设置numberOfLines0(此处为零表示行数不受限制)。

    myLabel.numberOfLines = 0;
    [myLabel sizeToFit];

带有 sizeToFit 的较长标签文本


更长的版本

我将在代码中制作我的标签,以便您可以看到发生了什么。您也可以在 Interface Builder 中设置大部分内容。我的设置是一个基于视图的应用程序,带有我在 Photoshop 中制作的背景图像以显示边距(20 点)。标签是迷人的橙色,因此您可以看到尺寸的变化。

- (void)viewDidLoad
{
    [super viewDidLoad];

    // 20 point top and left margin. Sized to leave 20 pt at right.
    CGRect labelFrame = CGRectMake(20, 20, 280, 150);
    UILabel *myLabel = [[UILabel alloc] initWithFrame:labelFrame];
    [myLabel setBackgroundColor:[UIColor orangeColor]];

    NSString *labelText = @"I am the very model of a modern Major-General, I've information vegetable, animal, and mineral";
    [myLabel setText:labelText];

    // Tell the label to use an unlimited number of lines
    [myLabel setNumberOfLines:0];
    [myLabel sizeToFit];

    [self.view addSubview:myLabel];
}

一些使用限制对sizeToFit居中或右对齐的文本起作用。这是发生的事情:

    // myLabel.textAlignment = NSTextAlignmentRight;
    myLabel.textAlignment = NSTextAlignmentCenter;

    [myLabel setNumberOfLines:0];
    [myLabel sizeToFit];

在此处输入图像描述

标签的大小仍为固定的左上角。您可以将原始标签的宽度保存在变量中并在之后设置它sizeToFit,或者给它一个固定的宽度来解决这些问题:

    myLabel.textAlignment = NSTextAlignmentCenter;

    [myLabel setNumberOfLines:0];
    [myLabel sizeToFit];

    CGRect myFrame = myLabel.frame;
    // Resize the frame's width to 280 (320 - margins)
    // width could also be myOriginalLabelFrame.size.width
    myFrame = CGRectMake(myFrame.origin.x, myFrame.origin.y, 280, myFrame.size.height);
    myLabel.frame = myFrame;

标签对齐


请注意,这sizeToFit将尊重您的初始标签的最小宽度。如果你从一个 100 宽的标签开始并调用sizeToFit它,它会给你一个 100(或稍小)宽度的(可能非常高)标签。您可能希望在调整大小之前将标签设置为所需的最小宽度。

通过调整框架宽度来更正标签对齐

其他一些需要注意的事项:

是否lineBreakMode尊重取决于它的设置方式。NSLineBreakByTruncatingTail(默认)在 之后被忽略sizeToFit,其他两种截断模式(头部和中间)也是如此。NSLineBreakByClipping也被忽略。NSLineBreakByCharWrapping照常工作。框架宽度仍然变窄以适合最右边的字母。


使用 Auto Layout 对 NIB 和 Storyboard 进行了修复:**

view如果您的标签作为使用自动布局的 ViewController的子视图包含在 nib 或情节提要中,那么将您的sizeToFit调用放入viewDidLoad将不起作用,因为在viewDidLoad调用后自动布局大小和子视图的位置将立即撤消您的效果sizeToFit称呼。sizeToFit但是,从内部调用viewDidLayoutSubviews 起作用。


我的原始答案(供/参考):

这使用该NSString方法sizeWithFont:constrainedToSize:lineBreakMode:来计算适合字符串所需的框架高度,然后设置原点和宽度。

使用要插入的文本调整标签框架的大小。这样您就可以容纳任意数量的行。

CGSize maximumSize = CGSizeMake(300, 9999);
NSString *dateString = @"The date today is January 1st, 1999";
UIFont *dateFont = [UIFont fontWithName:@"Helvetica" size:14];
CGSize dateStringSize = [dateString sizeWithFont:dateFont 
        constrainedToSize:maximumSize 
        lineBreakMode:self.dateLabel.lineBreakMode];

CGRect dateFrame = CGRectMake(10, 10, 300, dateStringSize.height);

self.dateLabel.frame = dateFrame;
2022-02-09