NSString sizeWithFont,问题

时间:2012-07-17 14:19:15

标签: iphone objective-c ios ios5 ios4

如果我试图找出字符串的宽度(

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. 
        }

    }

如果有人能提出解决方案,我会非常感激。

1 个答案:

答案 0 :(得分: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&#34;像素&#34;宽度。 &#34;你好&#34;正在回归28,&#34;那里&#34;正在回归32.所以你一起叮叮当然是64,但我得到了63.所以空间占据了3而不是4.同样,当我做到了#34;你好你好那里&#34;你会认为我会得到63 * 2 + 4的空间= 130.相反我得到了63 * 2 + 2.所以在这种情况下的空间实际上只占用2-3&#34;像素&#34;大多数情况下,如果我只为sizeWithFont:拨打@" ",我就会得到4.

字体并不总是为每个空间创建完全相同的间隙,这可能就是您遇到问题的原因。通过我的测试,我得到的空间是添加2,3或甚至4&#34;像素&#34;不同的单词组合。我认为只有在你拥有整个短语的情况下才能使用这个调用,尝试将它们全部加在一起太难了。是否有另一种方法来创建您正在寻找的功能?

编辑:我还发现只需要两个单词并将它们组合在一起就可以获得与单独拍摄不同的结果:

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

返回59,当&#34;你好&#34;返回28和&#34;那里&#34;返回32。