UIGraphicsGetCurrentContext parece devolver cero

Estoy tratando de convertir páginas PDF individuales en PNG aquí, y funcionó perfectamente hasta que UIGraphicsGetCurrentContext repentinamente comenzó a devolver nada.

Estoy tratando de volver sobre mis pasos aquí, pero no estoy muy seguro de saber en qué punto sucedió esto. Mi marco no es 0, lo que veo podría crear este problema, pero aparte de que todo "parece" correcto.

Aquí está el comienzo de mi código.

_pdf = CGPDFDocumentCreateWithURL((__bridge CFURLRef)_pdfFileUrl); CGPDFPageRef myPageRef = CGPDFDocumentGetPage(_pdf, pageNumber); CGRect aRect = CGPDFPageGetBoxRect(myPageRef, kCGPDFCropBox); CGRect bRect = CGRectMake(0, 0, height / (aRect.size.height / aRect.size.width), height); UIGraphicsBeginImageContext(bRect.size); CGContextRef context = UIGraphicsGetCurrentContext(); CGContextSaveGState(context); 

¿Alguien tiene alguna idea de qué otra cosa podría estar causando el context nulo?

De hecho, es posible reutilizar object CGContextRef una vez que se ha establecido en el método drawRect. El punto es que debe empujar el context a la stack antes de usarlo desde cualquier lugar. De lo contrario, el context actual será 0x0
1. Agregar

 @interface RenderView : UIView { CGContextRef visualContext; BOOL renderFirst; } 

2. En su @implementation primero establezca renderFirst en TRUE antes de que aparezca la vista en la pantalla, luego:

 -(void) drawRect:(CGRect) rect { if (renderFirst) { visualContext = UIGraphicsGetCurrentContext(); renderFirst = FALSE; } } 

3. Representación de algo en el context una vez que se estableció el context.

 -(void) renderSomethingToRect:(CGRect) rect { UIGraphicsPushContext(visualContext); // For instance UIGraphicsPushContext(visualContext); CGContextSetRGBFillColor(visualContext, 1.0, 1.0, 1.0, 1.0); CGContextFillRect(visualContext, rect); } 

Aquí hay un ejemplo que coincide exactamente con el caso de la cadena:

 - (void) drawImage: (CGImageRef) img inRect: (CGRect) aRect { UIGraphicsBeginImageContextWithOptions(aRect.size, NO, 0.0); visualContext = UIGraphicsGetCurrentContext(); CGContextConcatCTM(visualContext, CGAffineTransformMakeTranslation(-aRect.origin.x, -aRect.origin.y)); CGContextClipToRect(visualContext, aRect); CGContextDrawImage(visualContext, aRect, img); // this can be used for drawing image on CALayer self.layer.contents = (__bridge id) img; [CATransaction flush]; UIGraphicsEndImageContext(); } 

Y Dibujar image del context que se tomó antes en esta publicación:

 -(void) drawImageOnContext: (CGImageRef) someIm onPosition: (CGPoint) aPos { UIGraphicsPushContext(visualContext); CGContextDrawImage(visualContext, CGRectMake(aPos.x, aPos.y, someIm.size.width, someIm.size.height), someIm.CGImage); } 

No llame a la function UIGraphicsPopContext () hasta que necesite el context para representar sus objects.
Parece que CGContextRef se está eliminando de la parte superior de la stack gráfica automáticamente cuando termina el método de llamada.
De todos modos, este ejemplo parece ser una especie de Hack, no planificado y propuesto por Apple. La solución es muy inestable y funciona solo con llamadas de posts de método directo dentro de una sola vista UIV que está en la parte superior de la pantalla. En el caso de llamadas de "selección de ejecución", el context no muestra ningún resultado en la pantalla. Por lo tanto, sugiero utilizar CALayer como un renderizado al objective de la pantalla en lugar del uso directo del context gráfico.
Espero eso ayude.

No tiene que ser llamado desde "drawRect". También puede llamarlo después de "UIGraphicsBeginImageContext (bRect.size);"

Comprobar en la siguiente línea

 UIGraphicsBeginImageContext(bRect.size); 

si bRect.size no es 0,0

En mi caso, esta fue la razón por la cual el context devuelto en la línea siguiente fue nulo.

¿Estás llamando a UIGraphicsGetCurrentContext () dentro del método drawRect? Por lo que sé, solo se puede llamar dentro de drawRect, de lo contrario, solo devolverá cero.