2009-05-25 10 views
8

Pourquoi est-il si difficile de comprendre comment dessiner des caractères Unicode sur l'iPhone, en dérivant des métriques de police simples, comme la largeur de chaque glyphe imagé dans la police de son choix?Dessiner des caractères Unicode sur l'iPhone

Il semblerait que ce soit facile avec NSLayoutManager, mais cette API n'est apparemment pas disponible sur le téléphone. Il semble que la façon dont les gens font cela est d'utiliser une API privée, CGFontGetGlyphsForUnichars, qui ne vous fera pas passer les gardiens Apple dans l'App Store.

Quelqu'un peut-il me diriger vers la documentation qui montre comment faire cela? Je perds mes cheveux rapidement.

Howard

Répondre

3

Je suppose que l'exclusion de CGFontGetGlyphsForUnichars
était un oubli plutôt que d'une volonté délibérée, mais je ne suis pas
paris la ferme là-dessus. Ainsi, au lieu que j'utilise

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

et

[NSString sizeWithFont];

Cela a aussi l'avantage d'effectuer la substitution décente
sur les caractères manquants de votre police, quelque chose qui
CGContextShowGlyphs ne fait pas.

+0

Vous savez: c'est presque ça. Cela prend soin de mon besoin d'image le personnage, mais pas pour obtenir des mesures de police simple pour cela. Il s'avère que vous pouvez sauter dans et hors du contexte actuel ('UIGraphicsGetCurrentContext') et utiliser' CGContextGetTextPosition' avant et après le dessin pour obtenir essentiellement la largeur de la boîte englobante. C'est surtout ce qui m'intéresse, donc merci! – hkatz

+0

Attendez, quel est le problème avec '[@" a "sizeWithFont: ]'? Pourquoi avez-vous besoin de mesures pour les caractères individuels? –

+0

Il me donne des métriques parce que je fais un sizeWithFont pour chaque caractère. Andrew: Peut-être veut-il mettre les caractères en cache dans une texture, ou les dessiner le long d'un chemin. –

0

CoreText est la réponse si vous voulez dessiner unicode plutôt que CGContextShowGlyphsAtPositions. Aussi, il vaut mieux que [NSString drawAtPoint:withFont:] si vous avez besoin de dessin personnalisé. Voici un exemple complet:

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);