ios – 将文本垂直对齐到UILabel中的顶部

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

我如何垂直对齐文本始终处于顶部UILabel


没有办法设置垂直对齐UILabel,但是通过更改标签的框架可以获得相同的效果。我已将我的标签制成橙色,以便您清楚地看到发生了什么。

以下是快速简单的方法:

    [myLabel sizeToFit];



如果您的文字较长的标签将制作多行,则设置numberOfLines0(此处为零意味着无限制的行数)。
myLabel.numberOfLines = 0;
    [myLabel 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像往常一样工作。框架宽度仍然缩小以适合最右边的字母。


Mark Amery在评论中使用Auto Layout对NIB和Storyboard进行了修复:

如果您的标签包含在笔尖或故事板中作为view使用自动布局的ViewController 的子视图,则将您的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;

添加评论

友情链接:蝴蝶教程