2012-10-31 119 views
18

如何根據文字調整標籤寬度?如果文本長度很小,我希望標籤寬度很小...如果文本長度很小,我希望標籤寬度根據文本長度。可能嗎?iPhone - 根據文字調整UILabel寬度

其實我有兩個UI標籤。我需要把這兩個放在附近。但如果第一個標籤的文字太小,則會有很大的差距。我想消除這個差距。

+0

檢查我的回答第二部分。 – iDev

+0

嘗試歸屬文本文本。 – Vinayak

回答

37
//use this for custom font 
CGFloat width = [label.text sizeWithFont:[UIFont fontWithName:@"ChaparralPro-Bold" size:40 ]].width; 

//use this for system font 
CGFloat width = [label.text sizeWithFont:[UIFont systemFontOfSize:40 ]].width; 

label.frame = CGRectMake(point.x, point.y, width,height); 

//point.x, point.y -> origin for label; 
//height -> your label height; 
+0

很棒!謝謝! – badweasel

+12

已棄用iOS 7.0 – santuxus

3

嘗試這些選項,

UIFont *myFont = [UIFont boldSystemFontOfSize:15.0]; 
// Get the width of a string ... 
CGSize size = [@"Some string here" sizeWithFont:myFont]; 

// Get the width of a string when wrapping within a particular width 
NSString *mystring = @"some strings some string some strings..."; 
CGSize size = [mystring sizeWithFont:myFont 
           forWidth:150.0 
       lineBreakMode:UILineBreakModeWordWrap]; 

您還可以嘗試[label sizeToFit];使用這種方法,可以設置兩個標籤的幀,

[firstLabel sizeToFit]; 
[secondLabel sizeToFit]; 
secondLabel.frame = CGRectMake(CGRectGetMaxX(firstLabel.frame), secondLabel.origin.y, secondLabel.frame.size.width, secondLabel.frame.size.height); 
2

sizeWithFont constrainedToSize:lineBreakMode:是用原來的方法。下面是如何使用它的一個示例如下:

//Calculate the expected size based on the font and linebreak mode of your label 
CGSize maximumLabelSize = CGSizeMake(296,9999); 

CGSize expectedLabelSize = [yourString sizeWithFont:yourLabel.font constrainedToSize:maximumLabelSize lineBreakMode:yourLabel.lineBreakMode]; 

//adjust the label the the new height. 
CGRect newFrame = yourLabel.frame; 
newFrame.size.height = expectedLabelSize.height; 
yourLabel.frame = newFrame; 
0

嘗試以下操作:

/* Consider these two labels as the labels that you use, 
and that these labels have been initialized */ 

UILabel* firstLabel; 
UILabel* secondLabel; 

CGSize labelSize = [firstLabel.text sizeWithFont:[UIFont systemFontOfSize:12]]; 
//change the font size, or font as per your requirements 

CGRect firstLabelRect = firstLabel.frame; 

firstLabelRect.size.width = labelSize.width; 
//You will get the width as per the text in label 

firstLabel.frame = firstLabelRect; 


/* Now, let's change the frame for the second label */ 
CGRect secondLabelRect; 

CGFloat x = firstLabelRect.origin.x; 
CGFloat y = firstLabelRect.origin.y; 

x = x + labelSize.width + 20; //There are some changes here. 

secondLabelRect = secondLabel.frame; 
secondLabelRect.origin.x = x; 
secondLabelRect.origin.y = y; 

secondLabel.frame = secondLabelRect; 
+0

對不起...這對我不適用.. :( – Dev

+0

你面臨的問題是什麼? –

+0

我編輯了代碼,看看它是否正在工作 –

12

功能sizeWithFont:中的iOS 7.0棄用,因此,你必須使用sizeWithAttributes:適用於iOS 7.0 +。另外要詢問服務舊版本,下面這段代碼可用於:

CGFloat width; 
    if ([[UIDevice currentDevice].systemVersion floatValue] < 7.0) 
    { 
     width = [text sizeWithFont:[UIFont fontWithName:@"Helvetica" size:16.0 ]].width; 
    } 
    else 
    { 
     width = ceil([text sizeWithAttributes:@{NSFontAttributeName: [UIFont fontWithName:@"Helvetica" size:16.0]}].width); 
    } 

上的sizeWithAttributes:結果使用功能ceil()是由蘋果的文檔建議:

「這個方法返回小數的大小;使用返回的大小來您必須使用ceil函數將其值提高到最接近的較大整數。「

sizeWithAttributes

+0

這是做舊點的方法是什麼?爲什麼不總是使用sizeWithAttributes? – clocksmith

1

只使用,如果您使用您的視圖或廈門國際銀行或細胞

[LBl sizeToFit]; 

約束到,如果它不是那麼工作

dispatch_async(dispatch_get_main_queue(), ^{ 
[LBl sizeToFit]; 
}); 
+0

更新主線程上的UI是關鍵。即使我們沒有使用Blocks,也必須確保所有更新都在主線程中進行。 –

4
// In swift 2.0 
    let lblDescription = UILabel(frame: CGRectMake(0, 0, 200, 20)) 
    lblDescription.numberOfLines = 0 
    lblDescription.text = "Sample text to show its whatever may be" 
    lblDescription.sizeToFit() 

    // Its automatically Adjust the height 
+0

儘管此代碼片段可能會解決此問題,但[包括解釋](http://meta.stackexchange.com/questions/114762/explaining-entirely-code-based-answers)確實有助於提高帖子的質量。請記住,您將來會爲讀者回答問題,而這些人可能不知道您的代碼建議的原因。 – SmokeDispenser

+1

@Vinayak mahadev提供了關於代碼片段 – user23790

+0

的一些解釋嗨SmokeDispenser,只是給lblDescription.sizeToFit() 自動它將擴大UILabel高度。我們不需要計算任何東西。 – Vinayak

相關問題