2009-08-06 8 views
8

Estoy trabajando en una aplicación en la que estoy usando CGContextShowTextAtPoint para mostrar texto en la pantalla. También quiero mostrar caracteres japoneses, pero CGContextShowTextAtPoint toma como entrada una cadena C. Entonces, o bien A) ¿Cómo cambio los caracteres japoneses en una cadena C? Si esto no es posible, B) ¿Cómo puedo imprimir caracteres japoneses manualmente en la pantalla (dentro del método drawRect)?Iphone CGContextShowTextAtPoint para caracteres japoneses

Gracias de antemano.

Respuesta

5

CoreText puede ayudarle a:

  1. CTFontGetGlyphsForCharacters (iOS 3.2 en adelante) asigna caracteres Unicode a glifos
  2. CTFontDrawGlyphs (iOS 4.2 en adelante) dibuja los glifos en un CGContext.

NB. CGContextShowGlyphs debería funcionar, pero nunca encontré la manera de convertir mis UniChars en glifos. Más sobre esto here:

antiguo, pre IOS 3.2 respuesta

es necesario utilizar UIKit para esto.

Consulte [NSString drawAtPoint:...] para comenzar.

Este SO question es útil, también.

No sé lo que estaban pensando con el material de texto CoreGraphic, es inútil.

+0

Thanks :)! Después de leer un poco en Docs, parece que he codificado algo similar a la clase NSAttributedString, así que ahora debería cambiar todo mi código a :( – kiyoshi

+0

De nada. Ps No hay NSAttributeString en el iPhone, así que echa un vistazo a NSLabel. –

+0

Las rutinas de dibujo de texto de Core Graphics han existido en la Mac durante mucho tiempo, supongo que antes de que el soporte de Unicode se volviera común, por lo que no es demasiado sorprendente que solo admitan el conjunto de caracteres que tienen. También es posible que pueda imprimir caracteres personalizados con CGContextShowGlyphsAtPoint(), pero el reto es generar los glifos en el iPhone. Esta publicación tiene un ejemplo: http://www.gogo-robot.com/devblog/?p=5 –

1

Por lo que vale, pasé un largo tiempo tratando de hacer que los caracteres japoneses funcionen bien en CoreGraphics, y no me gustó donde me dejó.

Al final cambié el uso de UILabels para manejar el texto. Todas las cosas de CoreGraphics que necesitaba podían replicarse usando el soporte de animación de transformación &, y al final el código resultante era mucho más simple.

Puede que no sea apropiado para su situación, pero vale la pena considerarlo.

3

que era capaz de conseguir este trabajo mediante el uso de una reimplementación de CGFontGetGlyphsForUnichars por Jens Egeblad: GlyphDrawing.mm

primera carga en una fuente japonesa como un archivo OTF del paquete de aplicación:

// Load font file from otf file 
NSString *fontPath = [[NSBundle mainBundle] pathForResource:@"HStdNW8" ofType:@"otf"]; 
CGDataProviderRef fontDataProvider = CGDataProviderCreateWithFilename([fontPath UTF8String]); 
CGFontRef _cgFont = CGFontCreateWithDataProvider(fontDataProvider); 
CGDataProviderRelease(fontDataProvider); 

A continuación, puede convertir su texto unichar en glifos y dibujarlos:

NSString *text = @"日本語" 
CGContextSetFont(context, _cgFont); 
CGContextSetFontSize(context, 12); 
CGGlyph textGlyphs[[text length]]; 

unichar textChars[[text length]]; 
for(int i = 0; i < [text length]; i++) { 
    textChars[i] = [text characterAtIndex:i]; 
} 
CMFontGetGlyphsForUnichars(_cgFont, textChars, textGlyphs, [text length]); 
CGContextShowGlyphsAtPoint(context, xCoord, yCoord, textGlyphs, [text length]); 
+1

Donde Cómo puedo descargar GlyphDrawing.mm? El enlace está roto. –

0

Esto quizás le ayude% topic starter%. ¡Gracias a Rhythmic Fistman por un gran consejo!

CGContextRef context = UIGraphicsGetCurrentContext(); 
    CGContextSelectFont (context, [self.font.fontName cStringUsingEncoding:NSASCIIStringEncoding], self.font.pointSize, kCGEncodingMacRoman); 
    CGContextSetCharacterSpacing(context, characterSpacing); 
    CGContextSetFillColorWithColor(context, [self.textColor CGColor]); 
    CGAffineTransform myTextTransform = CGAffineTransformScale(CGAffineTransformIdentity, 1.f, -1.f); 
    CGContextSetTextMatrix (context, myTextTransform); 

    CGGlyph glyphs[self.text.length]; 
    CTFontRef fontRef = CTFontCreateWithName((CFStringRef)self.font.fontName, self.font.pointSize, NULL); 
    CTFontGetGlyphsForCharacters(fontRef, (const unichar*)[self.text cStringUsingEncoding:NSUnicodeStringEncoding], glyphs, self.text.length); 
    float centeredY = (self.font.pointSize + (self.frame.size.height- self.font.pointSize)/2)-2; 
    CGContextShowGlyphsAtPoint(context, rect.origin.x, centeredY, (const CGGlyph *)glyphs, self.text.length); 
    CFRelease(fontRef); 
Cuestiones relacionadas