将文本垂直对齐到UILabel内的顶部

我有一个ui标签,有两行文本的空间。有时,当文本太短时,此文本将显示在标签的垂直中心

如何垂直对齐文本,使其始终位于ui标签的顶部

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

以下是一种快速简便的方法:

[myLabel sizeToFit];


如果标签上的文字较长,会有多行,请将numberOfLines设置为0(这里的零表示无限行数)

myLabel.numberOfLines=0;
[myLabel sizeToFit];


较长版本

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

-(无效)视图加载
{
[超级视图下载];
//上边缘和左边缘各20点。尺寸为在右侧留下20点。
CGRect labelFrame=CGRectMake(20,20,280,150);
UILabel*myLabel=[[UILabel alloc]initWithFrame:labelFrame];
[myLabel setBackgroundColor:[UIColor orangeColor]];
NSString*[email protected]“我是现代少将的典范,我有植物、动物和矿物的信息”;
[myLabel setText:labelText];
//告诉标签使用不限行数
[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;
//将框架宽度调整为280(320-边距)
//宽度也可以是myOriginalLabelFrame.size.width
myFrame=CGRectMake(myFrame.origin.x,myFrame.origin.y,280,myFrame.size.height);
myLabel.frame=myFrame;


请注意,sizeToFit将尊重初始标签的最小宽度。如果您从一个100宽的标签开始,并在其上调用sizeToFit,它将返回一个宽度为100(或略小于100)的标签(可能非常高)。在调整大小之前,可能需要将标签设置为所需的最小宽度

还有一些需要注意的事项:

是否尊重lineBreakMode,取决于它的设置方式NSLineBreakByTruncatingTail(默认值)在sizeToFit之后被忽略,其他两种截断模式(head和middle)也是如此NSLineBreakByClipping也被忽略NSLineBreakByCharWrapping正常工作。帧宽度仍会缩小以适合最右边的字母


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

如果标签作为使用autolayout的ViewController的视图的子视图包含在nib或故事板中,则将sizeToFit调用放入viewDidLoad将不起作用,因为在调用viewDidLoad之后,自动布局会调整子视图的大小和位置,并将立即撤消sizeToFit调用的效果。但是,从viewdilayoutsubviews中调用sizeToFit将起作用


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

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

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

cgsizemaximumsize=CGSizeMake(3009999);
NSString*dateStrin[email protected]“今天的日期是1999年1月1日”;
UIFont*dateFont=[UIFont fontWithName:@“Helvetica”大小:14];
CGSize dateStringSize=[dateString sizeWithFont:dateFont
constrainedToSize:最大大小
lineBreakMode:self.dateLabel.lineBreakMode];
CGRect dateFrame=CGRectMake(10,10300,dateStringSize.height);
self.dateLabel.frame=日期框;

发表评论