2008-11-09 14 views
7

Je veux afficher le symbole « infini » à l'aidecaractères Unicode Non Affichage

CGContextSelectFont(context, "HelveticaNeue", textSize, kCGEncodingMacRoman);  
CGContextShowTextAtPoint(context, myCenter.x, myCenter.y + textHeight, [sName  cStringUsingEncoding:NSMacOSRomanStringEncoding], [sName length]); 

Il est affiché sous la forme d'une boîte carrée, ou un cercle. J'ai découvert que ce symbole est en décimal 176 et 221E en format hexadécimal. J'utilise Helvetica comme police, et j'en ai essayé d'autres sans succès. Est-ce un problème avec l'encodage que j'utilise?

+0

Je mis à jour ma réponse ci-dessous ... il se avère que CGContextSetFont fonctionne vraiment qu'avec l'encodage MacRoman, ce qui est pas ce que vous avez besoin. Vous avez besoin du codage Unicode, ce qui signifie que vous devrez utiliser Core Text ou une autre méthode pour afficher vos caractères Unicode. –

Répondre

12

Il s'avère que CGContextSelectFont ne prend en charge que le codage MacRoman, qui ne contient essentiellement qu'un petit jeu de caractères. Pour afficher les caractères Unicode dans une chaîne, vous devez utiliser CGSetFont ou le système de dessin Cocoa. CGSetFont requiert que vous utilisiez Cocoa quand même pour mapper des caractères en glyphes, puis dessiner les glyphes en utilisant CGContextShowGlyphsAtPoint. Je vous recommande de rechercher d'autres manières de dessiner ces chaînes si vous avez vraiment besoin d'afficher des caractères Unicode.

Ce code sera essentiellement afficher le symbole de l'infini:

- (void)drawRect:(CGRect)rect { 
    unichar inf = 0x221E; // infinity symbol 
    NSString* sName = [[NSString alloc] initWithCharacters:&inf length:1]; 
    UIFont* font = [UIFont fontWithName:@"Helvetica" size:32.0]; 
    [sName drawInRect:CGRectMake(20, 20, 40, 40) 
      withFont:font]; 
    [sName release]; 
} 

Notez également que sur l'iPhone (et sur Mac) Helvetica Neue n'existe pas en fait ... son nom cartes juste de retour à Helvetica standard. Voir le tableau au http://daringfireball.net/misc/2007/07/iphone-osx-fonts pour plus d'informations sur les polices disponibles sur l'iPhone.

+0

Voici comment j'initialise sName: NSString * sName = [NSString stringWithUTF8String: "\ xE2 \ x88 \ x9E"]; Et avoir changer ce que vous suggérez ici, et je ne reçois pas le carré ou vide, je reçois un caractère étrange, mais ce n'est pas le symbole de l'infini. Quoi d'autre manque-t-il? – carlos

+0

C'est vraiment étrange ... J'ai le bon caractère ici. Quel symbole obtenez-vous? –

+0

Cela fonctionne maintenant. Merci. Performance sage, ce qui est mieux? – carlos

2

Il convient de noter que vous pouvez toujours utiliser les fonctions CGContext à côté de - [NSString drawWithRect:] et ses cousins. Par exemple, le code suivant dessine une chaîne (qui peut inclure tous les caractères, y compris le symbole de l'infini qui a commencé ce sujet) avec 50% -opaque noir:

CGContextSaveGState(context); 
CGContextSetRGBFillColor(context, 0, 0, 0, 0.5); 
[self.text drawInRect:targetRect withFont:self.font]; 
CGContextRestoreGState(context); 
0

Vous voulez éviter drawInRect: withFont: (en MonoTouch : DrawString (chaîne, RectangelF, police UIFont) que cette API jusqu'à ce que iPhoneOS 4.0 ne restitue pas les chaînes qui pourraient contenir certains caractères Unicode (comme les dingbats) et va couper silencieusement le rendu à ce point

À la place, vous devez utiliser drawInRect: withFont: lineBreakMode: alignment: (dans MonoTouch, il s'agit de la méthode DrawString (string msg, RectangleF rect, police UIFont, UILineBreakMode breakMode, UITextAlignment align) comme cela est correctement rendu.

En outre, toutes les polices sur l'iPhone est un ensemble complet de polices, vous pouvez utiliser la référence suivante:

http://daringfireball.net/misc/2007/07/iphone-osx-fonts

Pour une liste des polices qui ont le jeu de caractères.

1

voici la réponse MonoTouch:

UIGraphics.PushContext (mBmpContext); 
mBmpContext.SetRGBFillColor(1f,1f,1f,1f); 
var font = UIFont.FromName ("Arial", 30); 
using (var nsstr = new NSString ("äöü ÜÖÄ")){ 
    nsstr.DrawString (new PointF (10, 400), font); 
} 
UIGraphics.PopContext()