2012-08-08 89 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