Question

Situation étrange - exemples d'œuvres de pomme, 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:

#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" );
}
Était-ce utile?

La solution

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

Il est pas évident ce qui va mal dans votre cas. Il y a deux choses à surveiller dans ce cas: le texte peut tirer la tête en bas en raison de la Flipped espace de coordonnées UIViews et leurs CALayers, et comme Rythmique Fistman souligne, cela ne gère pas 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]];

Autres conseils

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

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

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

Ce n'a probablement pas sa place dans une réponse séparée.

Autres

ici et ) ont fait des transformations affines et utilisé la méthode CGContextShowTextAtPoint pour pour ce faire du 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 de CGContextSetRGBFillColor prend des arguments à virgule flottante dans la plage de 0,0 à 1,0. Vous utilisez 255 pour indiquer « couleur », ce qui est ce que la méthode attend. Ce qui suit devrait fonctionner, si vous êtes plus à l'aise avec le 0 à 255 plage:

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

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

Essayez de changer kCGEncodingFontSpecific à kCGEncodingMacRoman.

Plus tard, quand vous obtenez tout travail, se débarrasser de CGContextShowTextAtPoint.
Il est des ordures, non-unicode et d'utiliser les versions glyphe dont vous aurez besoin à
appeler les API interdites. Vous n'y êtes pas mieux d'utiliser UIKit pour le dessin de texte.
Il est avisé unicode et fait aussi la substitution de glyphe décent pour les caractères
qui ne sont pas présents dans votre police.

Il y a une autre possibilité et que la position du texte que vous spécifiez se situe 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));

utiliser la méthode CGContextSetTextMatrix. Le « problème à l'envers vers le bas » est de la matrice.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top