2012-08-08 97 views
23

有没有办法“顶部对齐”UILabel,也就是让文本粘贴到标签视图的顶部?与中心垂直对齐,还是浮动在视图的中心,默认情况下一样?顶部对齐的UILabel,使文本粘贴到标签视图的顶部-ios

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

enter image description here

+0

下面是我给了一个类似的问题的答案:http://stackoverflow.com/questions/1054558/vertically-align-text-within -a-uilabel/1054681#1054681 – 2012-08-08 14:59:27

+0

此链接为我做了。感谢nevan国王!任何与我有同样问题的人都可以访问上面的链接,或者查看我的答案,我想你会找到解决方案。 – Mrwolfy 2012-08-09 01:39:56

+1

QUICK TRICK ...只需sizeToFit – Fattie 2013-12-12 10:34:00

回答

8

有没有办法在默认情况下的iOS设置UILabel的垂直对齐方式。相反,您将需要使用NSString提供的sizeWithFont方法之一。您使用哪一个取决于您是想要多行还是单行标签。 sizeWithFont:forWidth:lineBreakMode:可以用于单行标签,而sizeWithFont:constrainedToSize:lineBreakMode:可以用于多行标签。您可以轻松地加载字体参数与font有问题的标签属性。你可以看看here关于使用这些函数的更多细节。

根据NSString中的文本,这些方法将返回CGSize结构,其中标签的最小尺寸为最小尺寸。一旦标签尺寸正确,您可以轻松将其放置在您的超级视图顶部,并且它将显示为顶部对齐。

+2

您也可以调用标签上的sizeToFit将帧设置为其内容。 – 2012-08-08 15:06:11

11

我使用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

6

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

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

+0

对我有用:)如何使它成为多行?我似乎找不到一个允许这样的选项:/ – 2014-09-19 19:22:53

+0

是的,它的工作,但PLZ告诉我,我应该如何改变它的字体大小。我在自定义单元格上有我的TextView。 – mars 2015-08-31 12:00:00

24

有一种解决方法是:

  1. 设置一个高度&宽度constraintUILabel以恒定< =最大高度|宽度你想要的。将number of lines设为零。
  2. 将高度设置为storyboard以仅适合一条线。
  3. 在您的代码中设置UILabel的文本后请致电sizeToFit

这将使您的UILabel到你想要的最大宽度&高度和文本的范围内调整将始终顶部对齐。

+0

同样将高度约束设置为> =无论原始高度如何都将允许标签增长并保留在容器中的文本的左上角。 – TomG103 2015-01-27 21:08:41

+0

用'UICollectionViewCell'进入这个。常规sizeToFit不起作用。您的自动布局建议在此实例中起作用。谢谢! – 2016-08-18 20:39:50

+1

感谢您的文章,它适合那些想知道的人在iOS 11上的魅力:) – 2017-09-21 13:36:25

0

做一个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]; 
} 

我用这种垂直取向。

1

对于标签高度不需要保持不变的情况,有一种简单的解决方法:将Label放入Stack View。请确保将前导和尾随常数添加到Stack View。 这里是如何做到这一点的故事板的截图:

enter image description here