【问题标题】:NSString sizeWithFont, issueNSString sizeWithFont,问题
【发布时间】:2012-07-18 00:20:23
【问题描述】:

如果我尝试找出字符串的像素宽度

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

    }

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

【问题讨论】:

  • 我认为您在 for 循环中的短语末尾添加了一个额外的 @" "。这可能就是您获得更大宽度的原因。
  • 感谢@frowing,但这不是问题。
  • space 是一个棘手的事情,因为space 的大小在单词之间是不一样的,它的当前大小取决于space 前后的字母。 (尝试深入了解字体的几何形状以获取更多信息。)

标签: iphone objective-c ios ios5 ios4


【解决方案1】:

在做了一些测试之后,看起来像调用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”时" 你会认为我会得到 63*2 + 4 的空间 = 130。相反,我得到了 63*2 + 2。所以在这种情况下,大部分时间空间实际上只占用 2-3 个“像素”,但如果我打电话给sizeWithFont: 只需@" " 我得到4。

字体并不总是为每个空间创建完全相同数量的间隙,这可能就是您遇到问题的原因。通过我的测试,我得到了将 2、3 甚至 4 个“像素”添加到不同单词组合的空间。我认为只有当你有整个短语时才应该使用这个调用,尝试将它们加在一起太难了。是否有其他方法可以创建您正在寻找的功能?

编辑:我还发现,将两个单词放在一起会得到与单独使用不同的结果:

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

返回 59,而“Hello”返回 28,“There”返回 32。

【讨论】:

  • 非常感谢贾斯汀的回复。我也有你提到的相同统计数据。实际上,我正在使用带有一些选择性文本突出显示的 coregraphics 进行一些低级别的字符串绘制,为此我已经分解了字符串以用不同的颜色计算像素位置覆盖确切的单词,但我遇到了这个问题。好吧.. 我喜欢与 BREW 一起工作的那些日子,在这些日子里,这些字符串的像素宽度计算非常精确并且像魅力一样工作!!
  • @samfisher 我正在做同样的事情——用不同的颜色覆盖作品。你最后是怎么解决的?
猜你喜欢
  • 2011-06-22
  • 1970-01-01
  • 2011-04-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-12
相关资源
最近更新 更多