2009-08-06 3 views
8

Sto lavorando a un'app in cui sto utilizzando CGContextShowTextAtPoint per visualizzare il testo sullo schermo. Voglio anche visualizzare i caratteri giapponesi, ma CGContextShowTextAtPoint prende come input una stringa C. Quindi A) Come posso cambiare i caratteri giapponesi in una stringa C? Se questo non è possibile, B) Come posso stampare manualmente caratteri giapponesi sullo schermo (all'interno del metodo drawRect).Iphone CGContextShowTextAtPoint per caratteri giapponesi

Grazie in anticipo.

risposta

5

CoreText può aiutare:

  1. CTFontGetGlyphsForCharacters (iOS 3.2 in poi) Mappe caratteri Unicode a glifi
  2. CTFontDrawGlyphs (iOS 4.2 in poi) disegna i glifi in un CGContext.

NB. CGContextShowGlyphs dovrebbe funzionare, ma non ho mai trovato un modo per convertire i miei UniChar in glifi. Più su quello here:

antica, pre iOS 3.2 risposta

è necessario utilizzare UIKit per questo.

Per informazioni, consulta [NSString drawAtPoint:...].

Questo SO question è anche utile.

Non so cosa stessero pensando con il materiale di testo CoreGraphic, è inutile.

+0

Thanks :)! Dopo aver letto un po 'nella Docs, sembra che ho codificato qualcosa sulla falsariga della classe NSAttributedString quindi credo che ora dovrei passare tutto il mio codice per che :( – kiyoshi

+0

Non c'è di che. Ps Non c'è NSAttributeString su iPhone, quindi controlla NSLabel. –

+0

Le routine di disegno del testo di Core Graphics sono state utilizzate per molto tempo sul Mac, immagino che prima che il supporto Unicode diventi comune, quindi non sorprende che supportino solo il set di caratteri che fanno. Potresti anche essere in grado di stampare caratteri personalizzati con CGContextShowGlyphsAtPoint(), ma la sfida sta generando i glifi su iPhone. Questo post ha un esempio: http://www.gogo-robot.com/devblog/?p=5 –

1

Per quello che vale, ho passato molto tempo a cercare di far funzionare bene i personaggi giapponesi in CoreGraphics e non mi piaceva dove mi rimaneva.

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

Potrebbe non essere appropriato per la situazione, ma vale la pena considerare.

3

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

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

Poi si in grado di 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]); 
+1

Dove posso scaricare GlyphDrawing.mm? Il link è rotto –

0

Questo forse aiuta% argomento di avviamento%. Grazie a Rhythmic Fistman per l'ottimo consiglio!

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