Iphone CGContextShowTextAtPoint para caracteres japoneses
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.
Solução
CoreText pode ajudá-lo:
-
CTFontGetGlyphsForCharacters
(iOS 3.2 em diante) mapeia caracteres Unicode para glifos -
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 ??strong>
você precisa usar UIKit para isso.
Confira [NSString drawAtPoint:...]
para começar.
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);