UIGraphicsGetCurrentContext似乎返回零

我试图在这里将各个PDF页面转换成PNG,直到UIGraphicsGetCurrentContext突然开始返回nil为止,这个工作是完美的。

我试图在这里追溯我的步骤,但是我不太确定我知道发生了什么事情。 我的框架不是0,我看到可能会造成这个问题,但除了这一切“看起来”是正确的。

这是我的代码的开始。

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

任何人有任何想法可能会导致无上下文?

事实上,CGContextRef对象可以在drawRect方法中设置后重用。 重点是 – 在任何地方使用它之前,您都需要将Context推入堆栈。 否则,当前上下文将是0x0
1.添加

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

2.在你的@implementation中,在视图出现在屏幕上之前,先将renderFirst设置为TRUE,然后:

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

3.设置上下文之后渲染一些东西。

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

这里是一个与线程案例完全匹配的例子:

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

和从这个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); } 

不要调用UIGraphicsPopContext()函数,直到需要上下文来渲染对象。
当调用方法结束时,似乎CGContextRef自动从graphics堆栈的顶部被移除。
无论如何,这个例子似乎是一种黑客 – 而不是由苹果计划和提出的。 该解决scheme非常不稳定,只能在屏幕顶部的一个UIView中直接调用方法消息。 在“执行select”调用的情况下,上下文不会在屏幕上显示任何结果。 所以,我build议使用CALayer作为屏幕目标的渲染,而不是直接的graphics上下文使用。
希望能帮助到你。

它不必从“drawRect”中调用。 你也可以在“UIGraphicsBeginImageContext(bRect.size);”之后调用它。

检查以下行

 UIGraphicsBeginImageContext(bRect.size); 

如果bRect.size不是0,0

在我的情况下,这是为什么返回的下一行上下文是null的原因。

你是否调用drawRect方法内的UIGraphicsGetCurrentContext()? 据我所知,只能在drawRect中调用,否则返回nil。