2016-03-15 51 views
0

我有一個UILabel,通常需要顯示一個或兩個單詞。UILabel adjustFont with multiline

很多時候,其中一個單詞不適合放在一行中,所以我想減小字體大小以使每個單詞至少適合一行(不能按字符分隔)。

使用http://beckyhansmeyer.com/2015/04/09/autoshrinking-text-in-a-multiline-uilabel/

self.numberOfLines = 2; 
self.lineBreakMode = NSLineBreakByTruncatingTail; 
self.adjustsFontSizeToFitWidth = YES; 
self.minimumScaleFactor = 0.65; 

中描述的技術,我發現,它起着很好當第二個詞不適合在只有一條線路。

enter image description here

但事實並非如此時,只有一個字,或第一個字是一個 不適合。 enter image description hereenter image description here

我設法解決的一個詞這樣的情況:

-(void)setText:(NSString *)text 
{ 
    self.numberOfLines = [text componentsSeparatedByString:@" "].count > 1 ? 2 : 1; 
    [super setText:text]; 
} 

但我怎麼能解決其中的第一個單詞不適合的情況下?有任何想法嗎?

+0

嘗試使用自動佈局可以輕鬆解決你的問題設置'self.lineBreakMode = NSLineBreakByWordWrapping' – Jelly

+0

它不會在任何情況下工作... – jdev

+0

。 –

回答

1

這個怎麼樣?

self.numberOfLines = [text componentsSeparatedByString:@" "].count; 
[self setAdjustsFontSizeToFitWidth:YES]; 

但是,這將排除標籤文本由兩個非常小的單詞組成的情況,例如「how are」。在這種情況下,整個字符串將在第一行中可見。如果你需要在單獨的行中顯示每個單詞,那麼我建議你在每個單詞後加上'\ n'。這意味着您必須在將字符串分配給標籤之前編輯該字符串。因此,一個通用的解決方案可能是這樣的:

NSString *string = @"how are"; //Let this be the string 
NSString *modifiedString = [string stringByReplacingOccurrencesOfString:@" " withString:@"\n"]; 
[self setText:modifiedString]; 
[self setTextAlignment:NSTextAlignmentCenter]; 
[self setAdjustsFontSizeToFitWidth:YES]; 
[self setNumberOfLines:0]; 
self.lineBreakMode = NSLineBreakByWordWrapping; 
+0

@jdev請看我編輯的答案。另外使用adjustFontSizeToFitWidth –

+0

對不起,我剛剛看到你更新了你的答案,當我發佈我的,並在你的之前,所以我刪除它。我不希望每個單詞都以兩行顯示,以防兩個單詞合併成一行。我需要將numberOfLines設置爲1,以便使adjustsFontSize適合一個單詞的情況,並且當有多個單詞時將它設置爲2,以防萬一兩個單詞不適合一行。 'adjustsFontSizeToFitWidth'已經設置爲YES,所以當調用'setText'時,它也應該計算字體大小。 – jdev

+0

我對你的困境仍不清楚。 –