我有一个UILabel
,空格可以放两行文字.有时,当文本太短时,此文本会显示在标签的垂直中心.
如何垂直对齐文本,使其始终位于UILabel
的顶部?
我有一个UILabel
,空格可以放两行文字.有时,当文本太短时,此文本会显示在标签的垂直中心.
如何垂直对齐文本,使其始终位于UILabel
的顶部?
无法在UILabel
上设置垂直对齐,但可以通过更改标签的边框来获得相同的效果.我把标签做成了橙色,这样你就能清楚地看到发生了什么.
以下是完成此操作的快速而简单的方法:
[myLabel sizeToFit];
如果标签的文本较长,可构成多行,请将numberOfLines
设置为0
(这里的零表示不限行数).
myLabel.numberOfLines = 0;
[myLabel sizeToFit];
Longer Version个
我会用代码制作我的标签,这样你就能看到发生了什么.您也可以在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
将遵守初始标签的最小宽度.如果你从一个sizeToFit
宽的标签开始,并在上面打sizeToFit
,它会给你一个sizeToFit
宽(或稍小)的标签(可能非常高).在调整大小之前,您可能需要将标签设置为所需的最小宽度.
其他一些需要注意的事项:
lineBreakMode
是否受到尊重取决于它是如何设定的.NSLineBreakByTruncatingTail
(默认值)在sizeToFit
之后被忽略,其他两种截断模式(头部和中间)也是如此.NSLineBreakByClipping
也被忽略.NSLineBreakByCharWrapping
像往常一样工作.框架宽度仍会缩小以适合最右边的字母.
100 gave a fix for NIBs and Storyboards using Auto Layout in the comments:
如果标签作为使用自动布局的ViewController的
view
的子视图包含在笔尖或情节提要中,则将sizeToFit
调用放入viewDidLoad
中将不起作用,因为自动布局在调用viewDidLoad
之后调整子视图的大小和位置,并将立即undo撤消sizeToFit
调用的效果.然而,从viewDidLayoutSubviews
will工作范围内拨打sizeToFit
.
这使用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;