gpt4 book ai didi

objective-c - 测量 CGFont 中最大字符的尺寸

转载 作者:搜寻专家 更新时间:2023-10-30 20:21:13 25 4
gpt4 key购买 nike

我正在使用 CoreAnimation 构建一个由多个层组成的 View ,稍后将对其进行动画处理。还有 CATextLayer 将只包含给定大小的给定字体的一个字符。为了使它漂亮,我想设置图层的边界,以便角色整齐地适合。

问题是我必须确定 CGFont 中最大字符的大小,这将是文本层边界计算的基础。

在关于 SO measure size of each character in a string 的这个问题中解释了如何获得每个字符的大小。因此,一种解决方案是遍历字体的字符并找出最大的字符。

但是我找到了CGFontGetFontBBox函数。 documentation

Return Value

The bounding box of the font.

Discussion

The font bounding box is the union of all of the bounding boxes for all the glyphs in a >font. The value is specified in glyph space units.

在我看来,这正是我想要的。一个问题仍然是我必须将字形空间单位转换回像素。我用下面的代码尝试了它,但它给出了奇怪的结果:

/* calculate the bounding box of the biggest character in the font with a given
* font size
*/
- (CGSize) boundingBoxForFont:(CGFontRef)aFont withSize:(CGFloat)aSize
{
if (!aFont) {
CFStringRef fontName = CFStringCreateWithCString(NULL, "Helvetica", CFStringGetSystemEncoding());
aFont = CGFontCreateWithFontName(fontName);
CFRelease(fontName);
}
CGRect bbox = CGFontGetFontBBox(aFont);
int units = CGFontGetUnitsPerEm(aFont);
CGFloat maxHeight = ( CGRectGetHeight(bbox) / (CGFloat) units ) * aSize;
CGFloat maxWidth = ( CGRectGetWidth(bbox) / (CGFloat) units ) * aSize;
return CGSizeMake(maxWidth, maxHeight);
}

奇怪的是,CGRect bbox 的宽度大于高度,这对我来说毫无意义,因为字体中的字符通常高度大于宽度,但也许我用错了。

是否有其他方法可以使用此功能?

编辑

会不会是我混淆了字符和字形?会不会是字体包含代表多个字符的宽字形?

最佳答案

是的,我认为您走在正确的轨道上。例如,诸如 ffl 之类的连字算作单个字形,并且很可能比高更宽。此外,破折号 — 应该与大写字母的高度一样宽。

关于objective-c - 测量 CGFont 中最大字符的尺寸,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10437567/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com