Pregunta

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

Gracias de antemano.

¿Fue útil?

Solución

CoreText puede ayudarte:

  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.

NÓTESE BIEN. CGContextShowGlyphs debería funcionar, pero nunca encontré una manera de convertir mis UniChars en glifos.Más sobre eso aquí:

Respuesta antigua, anterior a iOS 3.2

necesitas usar UIKit para esto.

Verificar [NSString drawAtPoint:...] Para empezar.

Este Entonces pregunta También es útil.

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

Otros consejos

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

En primer lugar de 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 el texto a unichar glifos y atraerlos:

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

Por lo que vale, pasé mucho tiempo tratando de conseguir los caracteres japoneses que funcionan bien en CoreGraphics, y no le gustó cuando me dejó.

Al final he pasado a utilizar UILabels para manejar el texto. Toda la materia CoreGraphics-como que necesitaba podría ser replicado mediante el apoyo transformar y animació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 considerar.

Esto tal vez le ayuda% del Tema%. Gracias a Fistman rítmica de 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);
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top