2012-06-29 181 views
9

我想垂直對齊我的應用程序的UILabel視圖中的文本。問題是我想要文本垂直對齊頂部和標籤的大小爲280 x 150.我只能實現這兩件事之一。如果我刪除線垂直對齊UILabel

[myLabel sizeToFit]; 

然後文本的對齊方式是正常的,但大小是搞砸了。但如果我添加上面的行,那麼對齊就會搞砸了,但大小還是可以的。我該如何解決這個問題。

我已經添加下面的代碼 -

CGRect labelFrame = CGRectMake(22, 50, 280, 150); 
UILabel *myLabel = [[UILabel alloc] initWithFrame:labelFrame]; 
[myLabel setText:finalRecipe]; 
[myLabel setBackgroundColor: [UIColor lightGrayColor]]; 
[myLabel setNumberOfLines:0]; 
[myLabel sizeToFit]; 
[self.view addSubview:myLabel]; 
+0

可能的重複[如何設置UILable for iOS應用程序的左上對齊?](http://stackoverflow.com/questions/7192088/how-to-set-top-left-alignment-for-uilable- for-ios-application) –

+0

您是否嘗試過使用UIFont更改字體大小? – prince

+0

爲什麼你沒有檢查標記任何給定的答案! –

回答

13

我FXLabel的作者,雖然我不知道馬尼什,我相信他是想幫助(如果他的廣告對我來說,我當然沒有要求他,我也沒有付錢 - 對不起曼尼什!)。

FXLabel的一個特性是它遵守標籤的UIContentMode屬性,如界面構建器中設置的那樣。這意味着你可以設置label.contentMode = UIViewContentModeTop;將文本對齊到標籤視圖的頂部(這對於常規UILabel不起作用)。相關的例子是在這裏:

https://github.com/nicklockwood/FXLabel/tree/master/Examples/Text%20Alignment

FXLabel是一個簡易的UILabel子類,所以我認爲這是問題被提出的一個非常好的解決方案。但是,如果海​​報寧可解決,而無需使用第三方庫(這是可以理解的)的問題,那麼這裏是代碼做到這一點:

CGRect labelFrame = CGRectMake(22, 50, 280, 150); 
UILabel *myLabel = [[UILabel alloc] initWithFrame:labelFrame]; 
[myLabel setText:finalRecipe]; 
[myLabel setBackgroundColor: [UIColor lightGrayColor]]; 
[myLabel setNumberOfLines:0]; 

CGFloat fontSize = 0.0f; 
labelFrame.size = [myLabel.text sizeWithFont:myLabel.font 
           minFontSize:myLabel.minimumFontSize 
          actualFontSize:&fontSize 
            forWidth:labelFrame.width 
          lineBreakMode:myLabel.lineBreakMode]; 

myLabel.frame = labelFrame; 
[self.view addSubview:myLabel]; 

注:(這是未經測試,所以道歉,如果有任何錯別字)

+0

Nick。別擔心。我在我的項目中使用FXLabel ..和它非常容易,所以我在這裏發佈.. – Mani

11

您需要繼承UILabel。試試這個:

- (void)drawTextInRect:(CGRect)rect 
{ 
    CGSize sizeThatFits = [self sizeThatFits:rect.size]; 
    rect.size.height = MIN(rect.size.height, sizeThatFits.height); 

    [super drawTextInRect:rect]; 
} 

正如你發現的那樣,UILabel將文本垂直居中在其範圍內。在這裏,我們詢問-sizeThatFits的文本塊大小,並使用它來限制傳遞給UILabel的繪圖矩形,以便從標籤邊界的頂部繪製文本。

你甚至可以支持忽略(嘆氣)contentMode屬性是這樣的:

- (void)drawTextInRect:(CGRect)rect 
{ 
    CGSize sizeThatFits = [self sizeThatFits:rect.size]; 

    if (self.contentMode == UIViewContentModeTop) { 
     rect.size.height = MIN(rect.size.height, sizeThatFits.height); 
    } 
    else if (self.contentMode == UIViewContentModeBottom) { 
     rect.origin.y = MAX(0, rect.size.height - sizeThatFits.height); 
     rect.size.height = MIN(rect.size.height, sizeThatFits.height); 
    } 

    [super drawTextInRect:rect]; 
} 

還有很多其他的解決方案,並討論在這裏:Vertically align text to top within a UILabel

+0

這是唯一的答案,讓我正確地垂直對齊UILabel的內容。我希望我可以多次投票給你! –

+0

這是讓我的標籤垂直對齊的唯一解決方案。謝謝!!! – grabury

16

不使用UILabel這一點。使用UIButtonUserInteractionEnabled = NO;,並有選擇垂直或水平對齊文本。

在這裏你去:

[btnDetail.titleLabel setNumberOfLines:5]; 
[btnDetail.titleLabel setLineBreakMode:NSLineBreakByCharWrapping]; 
[btnDetail setContentVerticalAlignment:UIControlContentVerticalAlignmentTop]; 
[btnDetail setContentHorizontalAlignment:UIControlContentHorizontalAlignmentLeft]; 
[btnDetail setUserInteractionEnabled:NO]; 
btnDetail.autoresizesSubviews = YES; 
btnDetail.autoresizingMask = UIViewAutoresizingFlexibleWidth; 
+0

對我來說,文字仍然對齊底部的中心......我只有一行文字,所以我必須刪除靈活的寬度和行數。 – jowie

-2

如下你可以做到這一點.......

  1. 從設置標籤的numberOfLines財產0 IB

  2. 將您的標籤的lineBreakMode設爲UILineBreakModeWordWrap非常非常imp ortant

現在不管你在標籤上僅有少數追加@ 「\ n」 來吧..... ex.-

[yourTextLabel setText:@"myLabel\n\n\n\n\n"]; 
+0

黑客,但它很簡單,它的工作原理! –

+0

@JeremyHicks:是的,它的簡單... –

0

我做到了,你想要什麼用實施分類:

.H

@interface UILabel (VerticalAlign) 
- (void)alignTop; 
- (void)alignBottom; 
@end 

.M

@implementation UILabel (VerticalAlign) 

#pragma mark 
#pragma mark - Align Methods 

- (void)alignTop 
{ 
    [self setFrame:[self newLabelFrame:UIControlContentVerticalAlignmentTop]]; 
} 

- (void)alignBottom 
{ 
    [self setFrame:[self newLabelFrame:UIControlContentVerticalAlignmentBottom]]; 
} 

#pragma mark 
#pragma mark - Helper Methods 

- (CGRect)newLabelFrame:(UIControlContentVerticalAlignment)alignment 
{ 
    CGRect labelRect = self.frame; 

    NSStringDrawingOptions options = NSStringDrawingUsesLineFragmentOrigin | NSStringDrawingTruncatesLastVisibleLine | NSStringDrawingUsesFontLeading; 

    CGRect textRect = [self.text boundingRectWithSize:CGSizeMake(227.f, CGFLOAT_MAX) 
               options:options 
              attributes:@{NSFontAttributeName:self.font} 
               context:nil]; 

    CGFloat textOffset = labelRect.size.height - textRect.size.height; 

    UIEdgeInsets contentInsets; 
    if (alignment == UIControlContentVerticalAlignmentTop) 
    { 
     if (textOffset < (labelRect.size.height/2.f)) 
     { 
      contentInsets = UIEdgeInsetsMake(-textOffset, 0.f, 0.f, 0.f); 
     } 
     else 
     { 
      contentInsets = UIEdgeInsetsMake(0.f, 0.f, textOffset, 0.f); 
     } 
    } 
    else 
    { 
     if (textOffset < (labelRect.size.height/2.f)) 
     { 
      contentInsets = UIEdgeInsetsMake(0.f, 0.f, -textOffset, 0.f); 
     } 
     else 
     { 
      contentInsets = UIEdgeInsetsMake(textOffset, 0.f, 0.f, 0.f); 
     } 
    } 

    return UIEdgeInsetsInsetRect(labelRect, contentInsets); 
} 

@end 

請記住,您需要將「NumberOfLines」設置爲0.本示例適用於多行選項!

後您實現上述類別,你可以簡單地做:

[myLabel setText:finalRecipe]; 
[myLabel alignTop]; 

乾杯!

8

在斯威夫特,子類UILabel,覆蓋drawTextInRect,符合UIViewContentMode的JRC的解決方案是這樣的:

class AlignableUILabel: UILabel { 

    override func drawText(in rect: CGRect) { 

     var newRect = CGRect(x: rect.origin.x,y: rect.origin.y,width: rect.width, height: rect.height) 
     let fittingSize = sizeThatFits(rect.size) 

     if contentMode == UIViewContentMode.top { 
      newRect.size.height = min(newRect.size.height, fittingSize.height) 
     } else if contentMode == UIViewContentMode.bottom { 
      newRect.origin.y = max(0, newRect.size.height - fittingSize.height) 
     } 

     super.drawText(in: newRect) 
    } 

} 

實施是一個簡單的問題:

yourLabel.contentMode = UIViewContentMode.top 

對於我來說,它的工作像一個魅力。

+0

注:@rsc在2017年7月9日更新了Swift 3.1 – Roshambo

1

您可以在界面構建器上對其進行約束。

  1. 將要
  2. 創建一個高度足夠約束的行數較大的3個系和關係部分把「小於或等於」。

希望這對你有所幫助!