2009-08-09 7 views
3

ich versuche, eine Zeichenfolge in dieser Textur zu zeichnen:Flipped NSString in CGContext Zeichnung

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

aber die grünen Zahlen scheinen vertikal gespiegelt. ich meinen Kontext auf diese Weise erstellt haben:

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

und ich habe die Saiten ziehen:

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

Die Transformationsmatrix die Identitätsmatrix scheint ... ist kein CGAffineTransform auf diesen Kontext angewendet . Wenn die Zeichenfolge umgedreht wird, werden vielleicht alle meine Bilder gewendet! Irgendwelche Vorschläge?

PS: Sorry für mein Englisch;)

Antwort

7

Wie beschreiben here, das Koordinatensystem für einen Kontext innerhalb eines UIView oder dessen Schicht invertiert wird, wenn in den normalen Quartz Ziehraum verglichen. Wenn Sie jedoch mit Quartz ein Bild zeichnen, ist dies nicht mehr der Fall. Die UIStringDrawing Cocoa Touch-Kategorie in NSString, die die Methode -drawAtPoint: withFont: liefert, geht von einem invertierten Layout aus, und deshalb sehen Sie den umgedrehten Text in Ihrem Bild.

Eine Möglichkeit, dies zu umgehen, wäre, den Grafikstatus zu speichern, eine Umkehrtransformation auf das Bild anzuwenden, den Text zu zeichnen und den alten Grafikzustand wiederherzustellen. Dies würde etwa wie folgt aussehen:

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

Dies ist ein ziemlich grobes Beispiel, dass ich glaube, dass es nur den Text am unteren Rand des Bildes zieht, aber Sie sollten die Übersetzung oder die Koordinate anpassen können, des Textes, um es dort zu platzieren, wo es gebraucht wird.

2

speichern besser der Text ‚s Matrix vor ziehen, sonst wird es andere Text-Unentschieden CoreGraphic beeinflussen:

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