2012-09-14 14 views
12

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

Estoy tratando de volver sobre mis pasos aquí, pero no estoy seguro de saber en qué momento sucedió esto. Mi fotograma no es 0, lo que veo podría crear este problema, pero aparte de eso, 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é más podría estar causando el contexto nil?

Respuesta

2

De hecho, es posible tener el objeto CGContextRef reutilizable después de que se haya establecido en el método drawRect. El punto es que necesita empujar el Contexto a la pila antes de usarlo desde cualquier lugar. De lo contrario, el contexto actual será 0x0
1. Añadir

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


2. En su conjunto @implementation primera renderFirst en TRUE antes vista ha aparecido en la pantalla, entonces:

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


3 Presentar algo al contexto después de establecer el contexto.

-(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 coinciden exactamente con el caso de rosca:

- (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 dibujo de imagen a partir del contexto que se ha hecho antes en este post:

-(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 hacer llama a la función UIGraphicsPopContext() hasta que necesites el contexto para renderizar tus objetos.
Parece que CGContextRef se elimina automáticamente de la parte superior de la pila de gráficos cuando finaliza el método de llamada.
De todos modos, este ejemplo parece ser un tipo de Hack, no planeado y propuesto por Apple. La solución es muy inestable y solo funciona con llamadas a mensajes de método directo dentro de una sola UIView que se encuentra en la parte superior de la pantalla. En el caso de llamadas "performselection", Context no genera ningún resultado en la pantalla. Por lo tanto, sugiero usar CALayer como una representación para el objetivo de la pantalla en lugar del uso directo del contexto gráfico.
Espero que ayude.

28

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

+0

Sí, ¡esta pregunta ya ha sido respondida varias veces en Stack Overflow! – borrrden

+0

Todavía no estoy seguro de lo que lo está causando, pero usé el PDF de otra persona para crear clases de imagen aquí y eso lo solucionó. También usa UIGraphicsGetCurrentContext sin que esté en drawRect, y funciona bien allí. –

+0

@borrrden ¿Podrían darme algunos enlaces a las preguntas similares? – allenlinli

34

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

Fecha de entrada siguiente línea

UIGraphicsBeginImageContext(bRect.size); 

si no bRect.size 0,0

es En mi caso, esta fue la razón por la cual el contexto de regresar en la siguiente línea fue nula.

+3

sí, mi problema era que el tamaño es CGSizeZero – ninjaneer

Cuestiones relacionadas