gpt4 book ai didi

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

转载 作者:IT王子 更新时间:2023-10-29 07:24:04 24 4
gpt4 key购买 nike

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

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

image representing a UILabel with vertically-centered text

最佳答案

无法在 UILabel 上设置垂直对齐,但您可以通过更改标签的框架来获得相同的效果。我将标签设为橙色,这样您就可以清楚地看到发生了什么。

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

    [myLabel sizeToFit];

sizeToFit to squeeze a label


如果您的标签的文本较长且超过一行,请将 numberOfLines 设置为 0(这里的零表示行数不受限制)。

    myLabel.numberOfLines = 0;
[myLabel sizeToFit];

Longer label text with sizeToFit


加长版

我会用代码制作我的标签,这样您就可以看到发生了什么。您也可以在 Interface Builder 中设置其中的大部分内容。我的设置是一个基于 View 的应用程序,带有我在 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];

enter image description here

标签的大小仍然固定在左上角。您可以将原始标签的宽度保存在一个变量中并在 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;

label alignment


请注意,sizeToFit 将遵守您初始标签的最小宽度。如果您从一个 100 宽的标签开始并对其调用 sizeToFit,它会返回一个(可能非常高)宽度为 100(或更小)的标签。在调整大小之前,您可能希望将标签设置为所需的最小宽度。

Correct label alignment by resizing the frame width

其他一些注意事项:

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


Mark Amery在评论中使用自动布局修复了 NIB 和 Storyboard:

If your label is included in a nib or storyboard as a subview of the view of a ViewController that uses autolayout, then putting your sizeToFit call into viewDidLoad won't work, because autolayout sizes and positions the subviews after viewDidLoad is called and will immediately undo the effects of your sizeToFit call. However, calling sizeToFit from within viewDidLayoutSubviews will work.


我的原始答案(供后人/引用):

这使用 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;

关于ios - 在 UILabel 中将文本垂直对齐到顶部,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1054558/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com