2013-04-12 31 views
10

我目前使用如何在NSString包含表情符號時獲取NSString大小?

- (CGSize)sizeWithFont:(UIFont *)font constrainedToSize:(CGSize)size lineBreakMode:(UILineBreakMode)lineBreakMode 

得到一個NSString的大小。但是,當該字符串包含表情符號時,它似乎會計算文字unicode字符的大小,而不會考慮表情符號本身的大小,從而導致返回的大小不正確。

如何正確獲取帶有表情字符的字符串的大小,因爲它會出現在uilabel中?

+2

也許你可以給一個具體的(簡短的)字符串的例子,計算的大小和預期的大小。 –

+1

我剛剛嘗試過混合使用不同的表情符和羅馬字符,不同的字體,並且尺寸始終是正確的......也許問題出在您的'constrainedToSize:'參數,這個參數太小而不能包含字符串.. – Guillaume

+1

默認情況下,所有表情符號均以固定大小顯示,無論字體大小如何,NSString和UIFont都將完全忽略字體大小。我相信iOS上的表情符號字符總是以20px左右(非視網膜)繪製,所以它們將無法正確測量字符串的其餘部分。 –

回答

2

NSString不會呈現表情符號,它表示一個字符串,所以sizeWithFont只會佔用字符串。

我會用:

CGRect labelFrame = label.frame; 
labelFrame.size = [label sizeThatFits:CGSizeMake(100, 9999)]; 
[label setFrame:labelFrame]; 

//Alternatively 
[label sizeToFit]; 

裸記住,sizeToFit調用sizeThatFits:方法,所以在標籤只設置到合適的高度,sizeThatFits方面:更快,而且更容易在眼睛上。

+1

我很抱歉讓人失望,但是你會發現這不會解決問題,正如我在這裏的堆棧中所指出的那樣:http:// stackoverflow。 COM /問題/ 19537354 /表情符號 - 梅辛與 - OBJ-CS-sizewithfont,數學 –

1

我在同一件事情上掙扎了一段時間,嘗試了多種解決方案,包括接受的答案,這對我來說並不起作用。我通過創建一個帶有文本的NSAttributed字符串解決了這個問題,然後使用NSAttributedString方法boundingRectWithSize:options:context:來獲取字符串的大小。

NSString *text = //some text 
CGFloat maxSize = //text size constraints 

NSAttributedString *attributedString = [[NSAttributedString alloc] initWithString:text 
                     attributes:@{NSFontAttributeName : font 
                        }]; 

CGRect boundingRect = [attributedString boundingRectWithSize:maxSize options:NSStringDrawingUsesLineFragmentOrigin context:nil]; 
CGSize fitSize = boundingRect.size;