Ios 如何测量给定字体类型和字体大小中最大字符的最大大小?

Ios 如何测量给定字体类型和字体大小中最大字符的最大大小?,ios,fonts,Ios,Fonts,我想缓存给定字体类型和字体大小的字符的一些纹理,但我无法确定最大字符在整个unicode字符集中可能具有的最大大小 如何计算此大小?您要查找的是字体边界框(或BBox)。在iOS中,您需要一个CGFontRef,然后可以使用以下功能: CGRect CGFontGetFontBBox ( CGFontRef font ); 这将返回字体边界框,它是字体中所有glyph边界框的并集。它以字形单位返回值。您可以使用sizeWithFont: 并检查最大的(或最高的或面积最大的) 它适用于宽度

我想缓存给定字体类型和字体大小的字符的一些纹理,但我无法确定最大字符在整个unicode字符集中可能具有的最大大小


如何计算此大小?

您要查找的是字体边界框(或BBox)。在iOS中,您需要一个CGFontRef,然后可以使用以下功能:

CGRect CGFontGetFontBBox (
   CGFontRef font
);

这将返回字体边界框,它是字体中所有glyph边界框的并集。它以字形单位返回值。

您可以使用sizeWithFont:

并检查最大的(或最高的或面积最大的)

它适用于宽度和面积,但似乎所有字符都具有相同的高度,甚至是点”

不管怎样,我想这样的事情应该能回答你的问题:

UIFont* aFont = [UIFont fontWithName:@"HelveticaNeue" size:15];
NSString* charsToTest = @"abcdf...xyz, ABCD...XYZ, 0123...";
float maxArea = 0;
float maxWidth = 0;
float maxHeight = 0;
NSString* largerChar;
NSString* tallerChar;
NSString* biggerChar;
for (int i = 0; i<charsToTest.length; i++) {
    NSRange currentRange;
    currentRange.length = 1;
    currentRange.location = i;
    NSString* currentCharToTest = [charsToTest substringWithRange:currentRange];
    CGSize currentSize = [currentCharToTest sizeWithFont:aFont];
    if (currentSize.width > maxWidth) {
        maxWidth = currentSize.width;
        largerChar = currentCharToTest;
        NSLog(@"char:%@, new record width: %f", largerChar, maxWidth);
    }
    if (currentSize.height > maxHeight) {
        maxHeight = currentSize.height;
        tallerChar = currentCharToTest;
        NSLog(@"char:%@, new record height:%f", tallerChar, maxHeight);
    }
    float currentArea = currentSize.height * currentSize.width;
    if ( currentArea > maxArea) {
        maxArea = currentArea;
        biggerChar = currentCharToTest;
        NSLog(@"char:%@, new area record: %f", biggerChar, maxArea);
    }
}
// final resut:
NSLog(@"\n\n");
NSLog(@"char:%@ --> MAX WIDTH IS: %f", largerChar, maxWidth);
NSLog(@"char:%@ --> MAX HEIGHT IS: %f", tallerChar, maxHeight);
NSLog(@"char:%@ --> MAX AREA IS: %f\n\n", biggerChar, maxArea);
UIFont*aFont=[UIFont fontWithName:@“HelveticaNeue”大小:15];
NSString*charsToTest=@“abcdf…xyz,ABCD…xyz,0123…”;
float maxArea=0;
float maxWidth=0;
浮动最大高度=0;
NSString*largerChar;
NSString*tallerChar;
NSString*biggerChar;
对于(int i=0;i maxWidth){
maxWidth=currentSize.width;
largerChar=当前图表测试;
NSLog(@“char:%@,新记录宽度:%f”,largerChar,maxWidth);
}
如果(currentSize.height>maxHeight){
maxHeight=currentSize.height;
tallerChar=当前图表测试;
NSLog(@“char:%@,新记录高度:%f”,tallerChar,maxHeight);
}
浮动currentArea=currentSize.height*currentSize.width;
如果(currentArea>maxArea){
最大面积=当前面积;
biggerChar=当前图表测试;
NSLog(@“char:%@,新区域记录:%f”,biggerChar,maxArea);
}
}
//最终结果:
NSLog(@“\n\n”);
NSLog(@“char:%@-->最大宽度为:%f”,largerChar,maxWidth);
NSLog(@“char:%@-->最大高度为:%f”,tallerChar,maxHeight);
NSLog(@“char:%@-->最大面积为:%f\n\n”,biggerChar,maxArea);

Check out除了花费很长时间外,这将只测试您给定字符串中的特定字符。这与问题中指定的“整个unicode字符集中最大字符的最大大小”相差甚远。字体边界框是专门为大字体集(如果您需要,它是您在这里为字体支持的完整字符集建议的计算的缓存)而发明的。CGFontGetFontBBox的问题是它返回一个非像素的CGRect:“该值以字形空间单位指定”,我不确定这是否足以回答最初的问题。要查看角色列表。。。当然,我只是把我的答案集中在尺寸方面,得到通缉名单并不是什么大问题……字形空间单位是唯一可以返回的合理单位——你所要做的就是在事后考虑点的大小。使用您的方法是一个非常大的问题,因为这个问题特别涉及到完整的Unicode集。你知道在Unicode字体中可以有多少个字符吗?我怀疑你想打几千个电话给sizeWithFont。我很抱歉,但你的方法不正确。亲爱的大卫,我明白你的观点,但是,阅读原始问题:“我想缓存角色的一些纹理…”你不认为他会循环所有角色,为每个角色保存纹理吗?你真的认为在他的循环中添加sizeWithFont:会大大减慢他的方法吗?没有办法告诉iOS必须做什么才能获得你呈现的每个字符的宽度。充其量它会为每个角色加载大量信息,充其量它会渲染角色(但如果他们很聪明,就不会)。除此之外,字体BBox是专门为回答所有字符边界框并集的大小问题而发明的,这是有原因的。更不用说做一个调用加上一个度量转换肯定是更易于维护和优雅的代码。对不起,这不是因为你的代码是可能的,这也是明智的。谢谢你大卫,非常感谢!这就是我想要的。太好了!当我一次又一次地调试我的应用程序时,我发现传递给API的字体大小值正好是字符实际可以达到的最大高度,例如:fontsize=24,那么字符大小(以像素为单位)可能是{14,24}。。。{21, 24} .. {9,24},虽然宽度在变化,但高度仍然是24。我不确定这是否只是巧合。您对此有何看法?抱歉,刚才我尝试将字体大小设置为50,然后高度为59:是的,一般来说,我认为您会发现值低于或接近点大小,但是,正如你刚才发现的那样,肯定有一些字符具有较低的降序或较高的升序:)点大小当然可以很好地指示文本的大小,但它没有考虑例外情况。好的,谢谢。我想我可以使用一个固定值,例如:fontsize=26,正如我的实验所示,大多数时候实际绘制的字符大小小于31,当我发现大小大于31(或绑定大小32)时,我使用较小的字体大小重新绘制字符,直到其绘制大小小于绑定大小。这可能会解决问题。由于绘图操作不会频繁发生,因此性能应该是可以接受的。