30

有没有办法“顶部对齐”UILabel,即让文本贴在标签视图的顶部?与垂直居中对齐或浮动在视图中心相反,默认情况下?

这是三个标签的图像,左、右和居中对齐,以及一个居中和顶部对齐的 UITextView。无论视图的垂直大小如何,textView 的文本都会粘在顶部。我可以用标签做同样的事情吗?

在此处输入图像描述

4

7 回答 7

37

有一个解决方法:

  1. 使用常量 <=将高度和宽度设置constraint为您UILabel想要的最大高度|宽度。
  2. 设置number of lines为零。
  3. 将高度设置为storyboard仅适合一行。
  4. 在设置UILabelcall文本后的代码中sizeToFit

这将使您UILabel在所需的最大宽度和高度范围内调整大小,并且文本将始终顶部对齐。

于 2014-10-29T14:08:40.050 回答
12

我在对我的问题的评论中使用了nevan king上面链接的答案:Vertically align text to top within a UILabel

我使用的代码在这里:

- (void)setUILabelTextWithVerticalAlignTop:(NSString *)theText {
    CGSize labelSize = CGSizeMake(250, 300);
    CGSize theStringSize = [theText sizeWithFont:targetLabel.font constrainedToSize:labelSize lineBreakMode:targetLabel.lineBreakMode];
    targetLabel.frame = CGRectMake(targetLabel.frame.origin.x, targetLabel.frame.origin.y, theStringSize.width, theStringSize.height);
    targetLabel.text = theText;
}

//linked to a button that sets the text from a UITextView to the label.
- (IBAction)setText:(id)sender {

    [sourceText resignFirstResponder];
    [self setUILabelTextWithVerticalAlignTop:sourceText.text];
    [targetLabel setNumberOfLines:0];
    [targetLabel sizeToFit];

}

这是项目:

owolf.net/uploads/StackOverflow/verticalAlignUILabel.zip

于 2012-08-09T01:34:51.500 回答
10

UILabel在 iOS 中,默认情况下无法设置 a 的垂直对齐方式。相反,您将希望使用sizeWithFontNSString. 您使用哪一个取决于您需要多行标签还是单行标签。sizeWithFont:forWidth:lineBreakMode:可用于单行标签,同时sizeWithFont:constrainedToSize:lineBreakMode:可用于多行标签。font您可以使用相关标签的属性轻松加载字体参数。您可以在此处查看有关使用这些功能的更多详细信息。

这些方法将CGSize根据NSString. 一旦你有正确的标签大小,你可以很容易地将它放在你的超级视图的顶部,它看起来是顶部对齐的。

于 2012-08-08T14:56:13.667 回答
7

我已经用 UITextView 替换了 UILabel,因为在 UITextView 中,文本贴在顶部。

只是一个建议,它可能对某人有用。

于 2014-03-31T06:01:52.323 回答
1

创建一个 UILabel 的子类

.h 文件

@property (nonatomic, assign) UIControlContentVerticalAlignment verticalAlignment;

.m 文件

- (void) drawTextInRect:(CGRect)rect 
{
    if(_verticalAlignment == UIControlContentVerticalAlignmentTop ||  _verticalAlignment == UIControlContentVerticalAlignmentBottom)    
    {
         // If one line, we can just use the lineHeight, faster than querying sizeThatFits
         const CGFloat height = floorf(((self.numberOfLines == 1) ? ceilf(self.font.lineHeight) : [self sizeThatFits:self.frame.size].height));
          rect.origin.y = floorf(((self.frame.size.height - height) / 2.0f) * ((_verticalAlignment == UIControlContentVerticalAlignmentTop) ? -1.0f : 1.0f));
    }
    [super drawTextInRect:rect];
}


- (void) setVerticalAlignment:(UIControlContentVerticalAlignment)newVerticalAlignment
{
     _verticalAlignment = newVerticalAlignment;
     [self setNeedsDisplay];
}

我将它用于垂直对齐。

于 2016-04-22T06:43:37.490 回答
1

对于标签高度不需要保持不变的情况,有一个简单的解决方案:将您LabelStack View. 请务必将前导和尾随常量添加到Stack View. 这是如何在情节提要中执行此操作的屏幕截图:

在此处输入图像描述

于 2017-08-24T10:53:43.223 回答
0

我在我的应用程序中所做的是将 UILabel 的 line 属性设置为 0,并创建底部约束UILabel并确保将其设置为 >= 0,如下图所示。

在此处输入图像描述

于 2018-05-19T13:34:46.750 回答