2012-07-17 81 views
0

如果我試圖找出像素寬度爲一個字符串的NSString sizeWithFont,問題

CGSize sz = [@"Test text to hilight without new line for testing" sizeWithFont:CGTextLabel.font]; 

NSLog(NSStringFromCGSize(sz)); 

輸出爲:CoregraphicsDrawing [3306:F803] {339,21}

,如果我嘗試由空間@分隔字符串」「和循環它爲每個單詞+寬度爲每個單詞後添加空間寬度,總寬度是不同
CoregraphicsDrawing [3306:F803] 351.000000

請將此代碼放置在我的字計算寬度字:

str = @"Test text to hilight without new line for testing"; 


    self.words = [NSMutableArray arrayWithArray:[str componentsSeparatedByString:@" "]]; 

    CGFloat pos = 0; 
    [self.rects addObject:[NSValue valueWithCGPoint:CGPointMake(0, 0)]]; 
    for(int i = 0; i < [self.words count]; i++) 
    { 
     NSString *w = [self.words objectAtIndex:i]; 
     NSLog(w); 
     CGSize sz = [w sizeWithFont:CGTextLabel.font]; 
     pos += sz.width; 
     pos += [@" " sizeWithFont:CGTextLabel.font].width; 

     if(i != [self.words count]-1) 
     { 

      [self.rects addObject:[NSValue valueWithCGPoint:CGPointMake(pos, 0)]]; 
     } 
     else { 
      NSLog(@"%f",pos); //here actual calculated width is printed. 
     } 

    } 

如果任何人都可以提出一個解決方案,我會很感激。

+3

我認爲你在for循環中在短語的末尾增加了一個額外的@「」。這可能就是爲什麼你獲得更大的寬度。 – 2012-07-17 14:26:31

+0

謝謝@frowing,但這不是問題。 – samfisher 2012-07-17 16:31:28

+1

「空間」是一件棘手的事情,因爲這兩個詞之間的「空間」大小不一樣,它的當前大小取決於「空間」前後的字母。 (嘗試挖掘字體的幾何形狀以獲取更多信息。) – holex 2012-07-17 16:36:13

回答

3

做了一些測試後,它看起來像只用一個空格調用sizeWithFont:,增加了額外的空間,並沒有像字符之間的空間那樣對待它。這是我嘗試使用systemFont時發生的情況。

因此,每次使用[@" " sizeWithFont:CGTextLabel.font].width;時,您都不會獲得字符之間的空間大小,但最有可能在末尾添加一些額外的位。我注意到這一點使用下列內容:

CGSize size1 = [@"Hello There" sizeWithFont:[UIFont systemFontOfSize:12]]; 
CGSize size2 = [@" " sizeWithFont:[UIFont systemFontOfSize:12]]; 
CGSize size3 = [@"Hello" sizeWithFont:[UIFont systemFontOfSize:12]]; 
CGSize size4 = [@"There" sizeWithFont:[UIFont systemFontOfSize:12]]; 

CGSize size5 = [@"Hello There Hello There" sizeWithFont:[UIFont systemFontOfSize:12]]; 

NSLog(NSStringFromCGSize(size1)); 
NSLog(NSStringFromCGSize(size2)); 
NSLog(NSStringFromCGSize(size3)); 
NSLog(NSStringFromCGSize(size4)); 
NSLog(NSStringFromCGSize(size5)); 

我從控制檯這個返回:寬度

2012-07-17 10:57:40.513 TesterProject[62378:f803] {63, 15} 
2012-07-17 10:57:40.514 TesterProject[62378:f803] {4, 15} 
2012-07-17 10:57:40.514 TesterProject[62378:f803] {28, 15} 
2012-07-17 10:57:40.514 TesterProject[62378:f803] {32, 15} 
2012-07-17 10:57:40.514 TesterProject[62378:f803] {128, 15} 

所以單獨的空間返回4「像素」。 「Hello」正在返回28,「There」正在返回32.所以一起你會認爲它是64,但我得到了63.所以空間佔用了3,而不是4.同樣,當我做了「Hello There Hello There 「你會認爲我會在空間= 130時得到63 * 2 + 4,而我得到了63 * 2 + 2.因此,在這種情況下,空間大部分時間只佔用2-3像素,但如果我叫sizeWithFont:只是一個@" "我得到4

字體並不總是創造的差距爲每一個空間完全相同的量,這可能是爲什麼你有你的問題。通過我的測試,我獲得了在不同的詞組合中添加2,3或甚至4「像素」的空間。我認爲這個電話只能用在有整個短語的情況下,所以嘗試將它們加在一起是非常困難的。是否有另一種方法來創建您正在尋找的功能?

編輯:我還發現,只是把兩個詞,並把它們放在一起會給你單獨考慮他們不同的結果:

CGSize size = [@"HelloThere" sizeWithFont:[UIFont systemFontOfSize:12]]; 

返回59時,從「你好」返回28和「有」返回32

+0

非常感謝您回覆Justin。我也有你提到的相同統計數據。實際上,我正在使用coregraphics進行一些低級別的字符串繪圖,其中有一些選擇性的文本高亮顯示,並且我已經分解了字符串以覆蓋具有不同顏色計算像素位置的確切字詞,並且我陷入了這個問題。好吧..我喜歡那些與BREW一起工作的舊日子,這些像素寬度計算的字符串使用精確而且像魅力一樣工作! – samfisher 2012-07-17 16:30:59

+0

@samfisher我正在處理完全相同的事情 - 用不同顏色覆蓋作品。你最終如何解決它? – 2013-02-28 18:22:17