Domanda

Sto lavorando su un app dove sto utilizzando CGContextShowTextAtPoint per visualizzare il testo sullo schermo.Voglio anche visualizzare i caratteri Giapponesi, ma CGContextShowTextAtPoint prende come input una stringa C.Così sia) Come faccio a modificare i caratteri Giapponesi in una stringa di tipo C?Se questo non è possibile, B) Come posso stampare manualmente i caratteri Giapponesi di schermo (all'interno del metodo drawRect).

Grazie in anticipo.

È stato utile?

Soluzione

CoreText ti può aiutare:

  1. CTFontGetGlyphsForCharacters (iOS 3.2 in poi) le mappe di caratteri Unicode per i glifi
  2. CTFontDrawGlyphs (iOS 4.2 in poi) disegna le icone in una CGContext.

NB. CGContextShowGlyphs dovrebbe funzionare, ma non ho mai trovato un modo per convertire il mio UniChars di glifi.Di più qui:

Antico, pre iOS 3.2 risposta

è necessario utilizzare UIKit per questo.

Check out [NSString drawAtPoint:...] per ottenere iniziato.

Questo QUINDI, domanda è anche utile.

Non so che cosa stavano pensando con la CoreGraphic testo roba del genere, è inutile.

Altri suggerimenti

Sono stato in grado di ottenere questo lavoro utilizzando una reimplementazione di CGFontGetGlyphsForUnichars di Jens Egeblad: GlyphDrawing.mm

In primo luogo di carico in un font giapponese come file sistema organizzato di negoziazione dal bundle 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);

Quindi è possibile convertire il testo UNICHAR di glifi e disegnarli:

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

Per quello che vale, ho passato molto tempo cercando di ottenere i caratteri giapponesi a lavorare bene in CoreGraphics, e non è piaciuto dove mi ha lasciato.

Alla fine sono passato ad usare UILabels per gestire il testo. Tutta la roba CoreGraphics-come avevo bisogno potrebbe essere replicato con il supporto di trasformare e di animazione, e alla fine il codice risultante era molto più semplice.

Potrebbe non essere appropriato per la situazione, ma vale la pena prendere in considerazione.

Questo forse aiuta% argomento di avviamento%. Grazie alla ritmica Fistman per ottimi consigli!

    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);
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top