2012-07-17 84 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