2009-05-25 15 views
8

¿Por qué es tan difícil averiguar cómo dibujar caracteres Unicode en el iPhone, derivando simples métricas de fuentes a lo largo del camino, como qué tan ancho será cada glifo con imagen en la fuente de su elección?Dibujando caracteres Unicode en iPhone

Parece que sería fácil con NSLayoutManager, pero esa API aparentemente no está disponible en el teléfono. Parece que la forma en que las personas hacen esto es usar una API privada, CGFontGetGlyphsForUnichars, que no te permitirá pasar a los guardianes de Apple a la tienda de aplicaciones.

¿Alguien me puede indicar documentación que demuestre cómo hacerlo? Estoy perdiendo cabello rápidamente.

Howard

Respuesta

3

que supone que la exclusión de CGFontGetGlyphsForUnichars
fue un descuido en lugar de un movimiento deliberado, sin embargo no estoy
apostar hasta la camisa en él. Así que en vez utilizo

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

y

[NSString sizeWithFont];

Esto también tiene la ventaja de realizar la sustitución decente
en los personajes que faltan en su fuente, algo que
CGContextShowGlyphs no funciona.

+0

Ya sabes: eso es casi todo. Eso soluciona mi necesidad de crear una imagen del personaje, pero no para obtener métricas de fuente simples para ello. Resulta que puede saltar dentro y fuera del contexto actual ('UIGraphicsGetCurrentContext') y usar' CGContextGetTextPosition' antes y después del dibujo para obtener esencialmente el ancho del cuadro delimitador. Eso es principalmente lo que me interesa derivar, ¡así que gracias! – hkatz

+0

Espera, ¿qué pasa con '[@" a "sizeWithFont: ]'? ¿Por qué necesita métricas para caracteres individuales? –

+0

Me da métricas porque hago un sizeWithFont para cada personaje. Andrew: Tal vez quiera almacenar en caché los caracteres de una textura, o dibujarlos a lo largo de un camino. –

0

CoreText es la respuesta si desea dibujar Unicode en lugar de CGContextShowGlyphsAtPositions. También es mejor que [NSString drawAtPoint:withFont:] si necesita un dibujo personalizado. Aquí hay un ejemplo completo:

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