2009-08-09 4 views
3

je tente de dessiner une chaîne dans cette texture:Flipped NSString dessin dans CGContext

http://picasaweb.google.it/lh/photo/LkYWBv_S_9v2d6BAfbrhag?feat=directlink

mais les numéros verts semblent verticale basculée. J'ai créé mon contexte de cette façon:

colorSpace = CGColorSpaceCreateDeviceRGB(); 
data = malloc(height * width * 4); 
context = CGBitmapContextCreate(data, width, height, 8, 4 * width, colorSpace, kCGImageAlphaPremultipliedLast | kCGBitmapByteOrder32Big); 

et j'ai tirer les ficelles:

UIGraphicsPushContext(context); 

for(int i=0;i<packs.size();++i) 
{ 
    CGPoint points[4] = 
    { 
     gltextures[i].texCoords[0] * size.width,  //0 
     gltextures[i].texCoords[1] * size.height,  //1 

     gltextures[i].texCoords[2] * size.width,  //2 
     gltextures[i].texCoords[3] * size.height,  //3 

     gltextures[i].texCoords[4] * size.width,  //4 
     gltextures[i].texCoords[5] * size.height,  //5 

     gltextures[i].texCoords[6] * size.width,  //6 
     gltextures[i].texCoords[7] * size.height  //7 

    }; 

    CGRect debugRect = CGRectMake 
    (
    gltextures[i].texCoords[0] * size.width, 
    gltextures[i].texCoords[1] * size.height, 
    gltextures[i].width, 
    gltextures[i].height 
    ); 
    CGContextSetStrokeColorWithColor(context, [[UIColor redColor] CGColor]); 
    CGContextAddLines(context, points, 4); 
    CGContextClosePath(context); 
    CGContextDrawPath(context, kCGPathStroke); 

    NSString* s = [NSString stringWithFormat:@"%d",gltextures[i].texID]; 
    UIFont* font = [UIFont fontWithName:@"Arial" size:12]; 
    CGContextSetRGBFillColor(context, 0, 1, 0, 1); 
    [s drawAtPoint:points[0] withFont:font]; 
} 
UIGraphicsPopContext(); 

La matrice de transformation semble la matrice d'identité ... pas CGAffineTransform est appliqué à ce contexte . Si la chaîne est retournée, peut-être, toutes mes images sont retournées! Une suggestion?

PS: désolé pour mon anglais;)

Répondre

7

comme décrit here, le système de coordonnées d'un contexte dans un UIView ou sa couche est inversée par rapport à l'espace normal de dessin de quartz. Cependant, lorsque vous utilisez Quartz pour dessiner sur une image, ce n'est plus le cas. La catégorie UIStringDrawing Cocoa Touch sur NSString qui vous donne la méthode -drawAtPoint: withFont: suppose une disposition inversée, et c'est pourquoi vous voyez le texte inversé dans votre image. Une façon de contourner ce problème serait de sauvegarder l'état graphique, d'appliquer une transformation inversée à l'image, de dessiner le texte et de restaurer l'ancien état graphique. Cela ressemblerait à quelque chose comme ce qui suit:

CGContextSaveGState(context); 
CGContextTranslateCTM(context, 0.0f, self.bounds.size.height); 
CGContextScaleCTM(context, 1.0f, -1.0f); 

[text drawAtPoint:CGPointMake(0.0f, 0.0f) withFont:font]; 

CGContextRestoreGState(context); 

Ceci est un exemple assez brut dans la mesure où je crois qu'il attire tout le texte en bas de l'image, mais vous devriez être en mesure d'ajuster la traduction ou la coordonnée du texte pour le placer là où c'est nécessaire.

2

Vaut mieux la matrice du texte avant tirage, sinon il aura une incidence autre tirage texte par CoreGraphic:

CGContextSaveGState(ctx); 
CGAffineTransform save = CGContextGetTextMatrix(ctx); 
CGContextTranslateCTM(ctx, 0.0f, self.bounds.size.height); 
CGContextScaleCTM(ctx, 1.0f, -1.0f); 
[str drawAtPoint:point withFont:font]; 
CGContextSetTextMatrix(ctx, save); 
CGContextRestoreGState(ctx);