2009-08-06 9 views
8

Je travaille sur une application où j'utilise CGContextShowTextAtPoint pour afficher le texte à l'écran. Je veux également afficher les caractères japonais, mais CGContextShowTextAtPoint prend comme entrée une chaîne de caractères C. Donc soit A) Comment puis-je changer les caractères japonais en une chaîne C? Si ce n'est pas possible, B) Comment puis-je imprimer manuellement les caractères japonais à l'écran (dans la méthode drawRect).Iphone CGContextShowTextAtPoint pour les caractères japonais

Merci d'avance.

Répondre

5

CoreText peut vous aider:

  1. CTFontGetGlyphsForCharacters (iOS 3.2 et ultérieures) cartes de caractères Unicode à glyphes
  2. CTFontDrawGlyphs (iOS 4.2) TIRAGE partir glyphes dans un CGContext.

NB. CGContextShowGlyphs devrait fonctionner, mais je n'ai jamais trouvé un moyen de convertir mes UniChar en glyphes. Plus sur cette here:

antique, avant iOS 3.2 réponse

vous devez utiliser UIKit pour cela. Pour commencer, consultez [NSString drawAtPoint:...]. Ce numéro SO question est également utile.

Je ne sais pas ce qu'ils pensaient avec le contenu du CoreGraphic, c'est inutile.

+0

Merci :)! Après avoir lu un peu dans le Docs, il semble que j'ai codé quelque chose dans le sens de la classe NSAttributedString, donc je suppose que maintenant je devrais changer tout mon code :( – kiyoshi

+0

De rien. alors consultez NSLabel. –

+0

Les routines de dessin de texte de Core Graphics existent depuis longtemps sur le Mac, je suppose que la prise en charge d'Unicode est devenue courante, il n'est donc pas surprenant qu'ils ne supportent que le jeu de caractères qu'ils utilisent. Vous pouvez également être en mesure d'imprimer des caractères personnalisés avec CGContextShowGlyphsAtPoint(), mais le défi génère les glyphes sur l'iPhone. Ce post a un exemple: http://www.gogo-robot.com/devblog/?p=5 –

1

Pour ce que ça vaut, j'ai passé beaucoup de temps à essayer de faire fonctionner les caractères japonais dans CoreGraphics, et n'a pas aimé où il m'a laissé. En fin de compte, je suis passé à l'utilisation de UILabels pour gérer le texte. Tous les trucs de type CoreGraphics dont j'avais besoin pouvaient être répliqués à l'aide du support d'animation & de transformation, et à la fin le code résultant était beaucoup plus simple.

Cela peut ne pas convenir à votre situation, mais cela vaut la peine d'être considéré.

3

j'ai pu obtenir ce travail en utilisant une réimplémentation de CGFontGetGlyphsForUnichars par Jens Egeblad: GlyphDrawing.mm

charge d'abord dans une police japonaise en tant que fichier OTF du faisceau d'application:

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

Ensuite, vous peut convertir votre texte unichar en glyphes et les dessiner:

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

Où puis-je télécharger GlyphDrawing.mm? Le lien est cassé. –

0

Cela peut vous aider à% lancer le sujet%. Merci à Rhythmic Fistman pour de bons conseils!

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