顶部对齐的UILabel,使文本粘贴到标签视图顶部-ios

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

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

在此处输入图像描述

在iOS中,默认情况下无法设置UILabel的垂直对齐方式。 相反,您将需要使用NSString提供的sizeWithFont方法之一。 您使用哪一个取决于您是否需要多行或单行标签。 sizeWithFont:forWidth:lineBreakMode:可用于单行标签,而sizeWithFont:constrainedToSize:lineBreakMode:可用于多行标签。 您可以使用相关标签的font属性轻松加载font参数。 您可以在此处查看有关使用这些function的更多详细信息。

这些方法将根据NSString的文本返回标签最小大小的CGSize结构。 一旦您拥有正确的标签尺寸,您就可以轻松地将其放置在超级视图的顶部,并且它看起来是顶部对齐的。

有一个解决方法:

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

这将使您的UILabel在您想要的最大宽度和高度的范围内resize,文本将始终顶部对齐。

我在上面的问题评论中使用了nevan king上面连接的答案: 在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

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

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

创建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]; } 

我用它来进行垂直对齐。

对于标签高度不需要保持不变的情况,有一个简单的解决方案:将Label放在Stack View 。 确保将前导和尾随常量添加到Stack View 。 以下是如何在故事板中执行此操作的屏幕截图:

在此处输入图像描述

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

在此处输入图像描述