0

CoreText 方法 CTFontGetAdvancesForGlyphs 为此类数组的所有字形添加前进并返回总和。

但是,如果数组仅包含 1 个元素:

var offset = CCTFontGetAdvancesForGlyphs(myFont, .default, &myGlyph, nil, 1)

调用该方法只是执行一个简单的查找,例如当我访问一个变量时,还是会在每次调用时触发某种计算?

我想知道当我反复需要某些特定字形的宽度时是否需要将结果存储在一个常量中。

4

1 回答 1

1

看看这些行,这可能有助于理解函数的使用:

CGGlyph* glyphs = new CGGlyph[count];
CGSize*  advs   = new CGSize[count];

BOOL  ret = CTFontGetGlyphsForCharacters(fntRef, buffer, glyphs, count);
float sum = CTFontGetAdvancesForGlyphs  (fntRef, kCTFontOrientationHorizontal, glyphs, advs, count);
  • 缓冲区包含您的字符串(UniChar)
  • 对 CTFontGetGlyphsForCharacters 的调用将填充数组glyphs
  • 对 CTFontGetAdvancesForGlyphs 的调用将用每个字形的宽度填充数组advs 。

您现在可以执行以下操作:

CGPoint* positions   = new CGPoint[count];
for(int i=0;i<count;++i) {
    positions[i] = CGPointMake(x, y);
    x += advs[i].width + someAdditionalOffset;
}
CGContextShowGlyphsAtPositions(context, glyphs, positions, count);

您的字符串将根据您为每个字符设置的位置 x,y 显示。这组函数对于创建自定义对齐、自定义字距调整等非常有用。

于 2018-12-28T17:50:49.210 回答