Pergunta

Eu estou trabalhando em um aplicativo onde eu estou usando CGContextShowTextAtPoint ao texto do visor para a tela. Quero também exibir caracteres japoneses, mas CGContextShowTextAtPoint toma como entrada uma string C. Assim, ou A) Como faço para mudar caracteres japoneses em uma string C? Se isso não for possível, B) Como posso imprimir manualmente caracteres japoneses para a tela (dentro do método drawRect).

Agradecemos antecipadamente.

Foi útil?

Solução

CoreText pode ajudá-lo:

  1. CTFontGetGlyphsForCharacters (iOS 3.2 em diante) mapeia caracteres Unicode para glifos
  2. CTFontDrawGlyphs (IOS 4.2 em diante) extrai os glifos num CGContext.

NB. CGContextShowGlyphs deve funcionar, mas eu nunca encontrei uma maneira de converter meus UniChars para glifos. Mais sobre isso aqui :

Antiga, pré iOS 3.2 resposta

você precisa usar UIKit para isso.

Confira [NSString drawAtPoint:...] para começar.

Este é útil também.

Eu não sei o que eles estavam pensando com o material de texto CoreGraphic, é inútil.

Outras dicas

Eu era capaz de começar este trabalho usando uma reimplementação de CGFontGetGlyphsForUnichars por Jens Egeblad: GlyphDrawing.mm

Primeira carga em uma fonte japonesa como um arquivo OTF do pacote app:

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

Em seguida, você pode converter seu texto UNICHAR para glifos e atraí-los:

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 que vale a pena, eu passei muito tempo tentando fazer com que os caracteres japoneses para trabalhar bem no CoreGraphics, e não gostou onde ele me deixou.

No final, eu passou a usar UILabels para lidar com o texto. Todos os CoreGraphics-como material que eu precisava poderia ser replicado usando o suporte transformar e animação, e no final o código resultante era muito mais simples.

Pode não ser apropriado para sua situação, mas vale a pena considerar.

Esta talvez ajuda-% tópico arranque%. Graças à Rítmica Fistman para o grande conselho!

    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 em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top