Рисование символов Юникода на iPhone - PullRequest
8 голосов
/ 25 мая 2009

Почему так сложно понять, как рисовать символы Unicode на iPhone, получая простые метрики шрифта по пути, например, какова ширина каждого изображаемого глифа в выбранном шрифте?

Похоже, было бы легко с NSLayoutManager, но этот API, очевидно, недоступен на телефоне. Похоже, что люди делают это, используя частный API, CGFontGetGlyphsForUnichars, который не позволит вам пройти через привратники Apple в магазин приложений.

Кто-нибудь может указать мне документацию, которая показывает, как это сделать? Я быстро теряю волосы.

Howard

Ответы [ 3 ]

3 голосов
/ 25 мая 2009

Я предположил, что исключение CGFontGetGlyphsForUnichars
был упущением, а не осознанным ходом, однако я не
ставить ферму на это. Поэтому вместо этого я использую

[NSString drawAtPoint:withFont:]; (в UIStringDrawing.h)

и

[NSString sizeWithFont];

Это также имеет преимущество выполнения достойной замены
для символов, отсутствующих в вашем шрифте, что-то, что
CGContextShowGlyphs не делает.

1 голос
/ 16 марта 2016

CoreText - это ответ, если вы хотите нарисовать Unicode вместо CGContextShowGlyphsAtPositions. Также лучше, чем [NSString drawAtPoint:withFont:], если вам нужен пользовательский рисунок. Вот полный пример:

CTLineRef line = CTLineCreateWithAttributedString((CFAttributedStringRef)attributedString);
CFArrayRef runArray = CTLineGetGlyphRuns(line);

//in more complicated cases make loop on runArray
//here I assumed this array has only 1 CTRunRef within
const CTRunRef run = (CTRunRef)CFArrayGetValueAtIndex(runArray, 0);

//do not use CTFontCreateWithName, otherwise you won't see e.g. chinese characters
const CTFontRef font = CFDictionaryGetValue(CTRunGetAttributes(run), kCTFontAttributeName);

CFIndex glyphCount = CTRunGetGlyphCount(run);
CGGlyph glyphs[glyphCount];
CGPoint glyphPositions[glyphCount];

CTRunGetGlyphs(run, CFRangeMake(0, 0), glyphs);
//you can modify positions further
CTRunGetPositions(run, CFRangeMake(0, 0), glyphPositions);

CTFontDrawGlyphs(font, glyphs, glyphPositions, glyphCount, context);
CFRelease(line);
0 голосов
/ 02 августа 2009

Я сделал довольно подходящую замену для приватной функции. Читайте об этом здесь: http://thoughts.codemelody.com/2009/07/a-replacement-for-cgfontgetglyphsforunichars/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...