2015-11-07 1 views
1

Je suis en train de mettre à jour une ancienne application, mais je ne suis pas en mesure de faire en sorte que drawInRect fonctionne dans un contexte PDF.drawInRect ne fonctionne pas avec le PDF

J'ai remplacé la fonction dépréciée CGContextShowTextAtPoint par CGContextShowTextAtPoint (voir le code ci-dessous) mais elle n'écrit aucun texte.

Où est-ce que je me trompe?

Ceci est mon code:

-(NSMutableData *) writeToPDF { 

CGRect   pageRect; 

pageRect = CGRectMake(0.0f, 0.0f, 612, 850); 

NSMutableData *pdfData = [[NSMutableData alloc] init]; 
CGDataConsumerRef dataConsumer = CGDataConsumerCreateWithCFData((CFMutableDataRef)pdfData); 

CGContextRef pdfContext = CGPDFContextCreate(dataConsumer, &pageRect, NULL); 

CGContextSetTextDrawingMode (pdfContext, kCGTextFill); 

// Page 1 

CGContextBeginPage(pdfContext, &pageRect); 
CGContextSetRGBStrokeColor(pdfContext, 0, 0, 0, 1); 

CGAffineTransform transf = CGAffineTransformMake(1, 0, 0, -1, 0, pageRect.size.height); 
CGContextConcatCTM(pdfContext, transf); 

// Line - OK 

CGContextMoveToPoint(pdfContext,0,0); 
CGContextAddLineToPoint(pdfContext,pageRect.size.width,pageRect.size.height); 
CGContextDrawPath(pdfContext, kCGPathStroke); 

CGContextSetTextDrawingMode (pdfContext, kCGTextFill); 

CGAffineTransform myTextTransform = CGAffineTransformMake(1,0,0,-1,0,0); 
CGContextSetTextMatrix(pdfContext, myTextTransform); 

// Text - Old working code to replace because CGContextSelectFont and CGContextShowTextAtPoint are deprecated 

CGContextSelectFont(pdfContext, "Helvetica", 20, kCGEncodingMacRoman); 
CGContextShowTextAtPoint(pdfContext, 50, 50, [@"Hello" UTF8String], [@"Hello" length]); 

// Text - Replacing code that doesn't work 

NSDictionary *attrs = @{ NSForegroundColorAttributeName : [UIColor blackColor], 
         NSFontAttributeName : [UIFont systemFontOfSize:20] 
         }; 


[@"Hello2" drawInRect:CGRectMake(50, 100, 100, 100) withAttributes:attrs]; 

CGContextDrawPath(pdfContext, kCGPathStroke); 

CGContextEndPage(pdfContext); 

// 

CGPDFContextClose(pdfContext); 
CGContextRelease(pdfContext); 

CGDataConsumerRelease(dataConsumer); 

return pdfData; 
} 
+0

Je ne peux pas tester immédiatement votre code - mais définissez-vous le contexte graphique actuel quelque part? drawInRect utilise le contexte graphique actuel et je ne vois pas que vous avez défini votre contexte PDF comme étant actuel. Regardez UIGraphicsPushContext pour définir votre contexte PDF comme actuel. –

+0

Merci, c'est la solution. Tu as sauvé ma journée. Je me demandais comment le drawInRect aurait connu le contexte actuel, mais j'ai complètement raté UIGraphicsPushContext. – Fab

+0

Je vais écrire une courte réponse afin que vous puissiez l'approuver et d'autres personnes peuvent voir la réponse plus tard aussi. –

Répondre

1

Contrairement aux autres fonctions que vous utilisez, drawInRect ne prend pas un contexte graphique. Cela signifie qu'il utilise le contexte graphique actuel et vous devez vous assurer que votre contexte PDF est à jour avant de passer l'appel. Rendre votre contexte graphique actuel peut être fait avec la fonction UIGraphicsPushContext. N'oubliez pas d'afficher à nouveau le contexte graphique une fois que vous avez terminé.