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

时间:2012-08-08 14:48:36

标签: iphone objective-c ios xcode

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

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

enter image description here

7 个答案:

答案 0 :(得分:29)

有一个解决方法:

  1. 设定高度&宽度constraintUILabel,常数< =到你想要的最大高度宽度。
  2. number of lines设为零。
  3. storyboard中的高度设置为仅适合一行。
  4. 在设置UILabel来电sizeToFit
  5. 的文字后的代码中

    这会使您的UILabel在最大宽度和范围内调整大小。你想要的高度和文字总是顶部对齐。

答案 1 :(得分: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

答案 2 :(得分:9)

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

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

答案 3 :(得分:6)

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

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

答案 4 :(得分: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];
}

我用它来进行垂直对齐。

答案 5 :(得分:1)

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

enter image description here

答案 6 :(得分:0)

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

enter image description here