2009-07-12 7 views
5

Situation étrange - exemples d'Apple fonctionne, mais après que je les change un peu, le texte n'est pas affiché. Ce morceau de code tire correctement fond bleu, mais refuse de tirer texte, peu importe ce que je fais:iPhone: comment dessiner du texte dans une fenêtre?

#import <UIKit/UIKit.h> 

@interface CWnd : UIWindow @end 
@implementation CWnd 

- (void) drawRect : (CGRect) i_poRect 
{ 
    // This is working : windows is blue. 
    CGContextRef oContex = UIGraphicsGetCurrentContext(); 
    CGContextSetRGBFillColor(oContex, 0, 0, 255, 1); 
    CGContextFillRect(oContex, i_poRect); 
    // This is not working : not text is displayed. 
    CGContextSelectFont(oContex, "Monaco", 10, kCGEncodingFontSpecific); 
    CGContextSetRGBStrokeColor(oContex, 255, 0, 0, 1); 
    CGContextSetRGBFillColor(oContex, 255, 0, 0, 1); 
    CGContextSetTextDrawingMode(oContex, kCGTextFill); 
    CGContextSetTextPosition(oContex, 100, 100); 
    CGContextShowText(oContex, "abc", 3); 
} 

@end 

@interface CDelegate : NSObject <UIApplicationDelegate> @end 
@implementation CDelegate 

- (void)applicationDidFinishLaunching : (UIApplication *) i_poApp 
{ 
    CGRect oRect = [ [ UIScreen mainScreen ] bounds ]; 
    [ [ [ CWnd alloc] initWithFrame : oRect ] makeKeyAndVisible ]; 
} 

@end 

int main(int argc, char *argv[]) 
{  
    return UIApplicationMain(argc, argv, nil, @"CDelegate"); 
} 
+2

Maintenant que je le regarde, je ne crois pas que Monaco soit une police supportée sur l'iPhone. Essayez Helvetica et voyez si ça dessine: http://www.alexcurylo.com/blog/2008/10/05/snippet-available-uifonts/ –

+0

Vous avez raison. Aucune police nommée 'monaco' - j'ai essayé deux polices les plus utilisées sur mon PC de développement MacOS et je n'ai pas réussi à deviner. Il est dommage, bien que CGContextSelectFont ne jetez pas exception si la police unexisted est fournie :(. Il peut faire valoir dans la construction de débogage à la fin. – grigoryvp

Répondre

5

Je l'ai utilisé le code suivant sans problème pour dessiner le texte directement à un contexte Quartz:

CGContextSetStrokeColorWithColor(context, strokeColor); 
CGContextSetFillColorWithColor(context, strokeColor); 

CGContextSelectFont(context, "Helvetica", fontSize, kCGEncodingMacRoman); 
CGContextSetTextDrawingMode(context, kCGTextFill); 
CGContextSetTextPosition(context, 0.0f, round(fontSize/4.0f)); 
CGContextShowText(context, [text UTF8String], strlen([text UTF8String])); 

Ce n'est pas évident ce qui ne va pas dans votre cas. Dans ce cas, il y a deux choses à surveiller: le texte peut être renversé en raison de l'espace de coordonnées inversé de UIViews et de leurs CALayers, et comme le souligne Rhythmic Fistman, cela ne gère pas les encodages UTF.

Une meilleure, bien que moins performant, l'approche est de faire quelque chose comme:

CGContextSetFillColorWithColor(context, strokeColor); 
[text drawAtPoint:CGPointMake(0.0f, 0.0f) withFont:[UIFont fontWithName:@"Helvetica" size:fontSize]]; 
+0

[@ "abc" UTF8String] ne fonctionne pas non plus – grigoryvp

+0

btw, le texte anglais en UTF-8 est binaire compatible avec le texte anglais en ASCII :(. – grigoryvp

+0

CGContextSelectFont ne fonctionne pas correctement pour – Ganesh

1

Autres personnes (here et here) ont fait des transformations affines et utilisé la méthode CGContextShowTextAtPoint afin de le rendre travail:

CGContextSelectFont(oContex, @"Monaco", 10, kCGEncodingFontSpecific); 
CGContextSetTextDrawingMode(oContex, kCGTextFill); 
CGContextSetRGBFillColor(oContex, 1.0, 0.0, 0.0, 1.0); 
CGAffineTransform xform = CGAffineTransformMake(1.0, 0.0, 0.0, -1.0, 0.0, 0.0); 
CGContextSetTextMatrix(oContex, xform); 
CGContextShowTextAtPoint(oContex, 100, 100, "abc", 3); 

Un autre problème possible est que la méthode CGContextSetRGBFillColor prend des arguments à virgule flottante dans la gamme de 0,0 à 1,0. Vous utilisez 255 pour indiquer "en couleur", ce qui n'est pas ce que cette méthode attend. Ce qui suit devrait fonctionner, si vous êtes plus à l'aise avec la gamme 0 à 255:

CGContextSetRGBFillColor(oContex, 255/255.0, 0/255.0, 0/255.0, 1.0); 
+0

Modification 255 à 1.0f ne pas aider. Ajout de transformer ne pas aider. – grigoryvp

1

Hey, pourrait être un problème d'encodage.

Essayez de remplacer kCGEncodingFontSpecific par kCGEncodingMacRoman.

Plus tard, quand tout fonctionnera, débarrassez-vous de CGContextShowTextAtPoint.
Il est garbage, non-unicode et pour utiliser les versions de glyph dont vous aurez besoin
API d'appels interdits. Il vaut mieux utiliser UIKit pour le dessin de texte.
Il est savvy Unicode et fait également la substitution de glyphe décent pour les caractères
qui ne sont pas présents dans votre police.

+0

ne fonctionne pas aussi. Btw, vous pouvez copier et coller mon code, il n'aura pas besoin d'un projet ou quelque chose, juste compiler un seul fichier. M, exécutez-le et voir par vous-même :) – grigoryvp

+0

Pas de compilateur ici. Avez-vous essayé ce code dans un projet plus traditionnel, disons avec un fichier .xib? –

+0

Si cela fonctionne avec un fichier .xib et ne fonctionne pas sans elle, ce sera une magie noire dévastatrice. Et pour sûr, je dois savoir pourquoi il ne fonctionne pas :( – grigoryvp

3

Hey, je viens de trouver une note dans mon code.

Apparemment, CGContextShowTextAtPoint ne fonctionne pas avec CGContextSetFont. Vous devez à la place utiliser CGContextSelectFont. Évident, hein?

Quoi qu'il en soit, je sais que ce n'est pas le cas, mais vous pouvez essayer d'utiliser CGContextShowTextAtPoint.

Cela n'appartenait probablement pas à une réponse séparée.

+0

CGContextSelectFont est la fonction que j'utilise depuis le début.Il ne fonctionne tout simplement pas :(Et je ne trouve pas un exemple de pomme assez simple pour le dégrader en un tel code temps. – grigoryvp

1

Il existe une autre possibilité, à savoir que la position de texte que vous spécifiez se trouve en dehors du rectangle dans lequel vous essayez de dessiner. Il est facile de tester en remplaçant

CGContextSetTextPosition(oContex, 100, 100); 

avec

CGContextSetTextPosition(oContex, CGRectGetMidX(i_poRect), CGRectGetMidY(i_poRect)); 
1

méthode utilisation de CGContextSetTextMatrix.Le "problème à l'envers" provient de la matrice.