Как работает CTFontGetAdvancesForGlyphs? - PullRequest
0 голосов
/ 30 мая 2018

Метод CoreText CTFontGetAdvancesForGlyphs добавляет авансы для всех глифов массива таких и возвращает сумму.

Однако, если массив состоит только из 1 элемента:

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

вызывая метод, просто выполняя простой поиск, например, когда я получаю доступ к переменной, или он будет запускать какие-то вычисления для каждого вызова?

Мне интересно, нужно ли мне сохранять результат в константе, когда мне нужноширина некоторых определенных глифов многократно.

1 Ответ

0 голосов
/ 28 декабря 2018

Взгляните на эти строки, это может помочь понять использование функции:

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 заполнит массив глифы .
  • вызов 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, которые вы установили для каждого символа.Этот набор функций очень полезен для создания пользовательских выравниваний, кернинга и т. Д.

...