我正在尝试将单个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);
任何人都知道还有什么可能导致nil上下文?
答案 0 :(得分:41)
不必从“drawRect”调用它。 你也可以在“UIGraphicsBeginImageContext(bRect.size);”之后调用它。
签入以下行
UIGraphicsBeginImageContext(bRect.size);
如果bRect.size不是0,0
就我而言,这就是下一行返回的上下文为空的原因。
答案 1 :(得分:29)
您是否在drawRect方法中调用UIGraphicsGetCurrentContext()?据我所知,它只能在drawRect中调用,否则只返回nil。
答案 2 :(得分:2)
实际上,在drawRect方法中设置CGContextRef对象后,可以重用它。
关键是 - 在从任何地方使用Context之前,您需要将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();
}
并从本文中之前采用的上下文中绘制图像:
-(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会自动从图形堆栈的顶部删除 无论如何,这个例子似乎是一种哈克 - 不是苹果公司计划和提出的。该解决方案非常不稳定,仅适用于屏幕顶部的一个UIView内的直接方法消息调用。在“performselection”调用的情况下,Context不会向屏幕呈现任何结果。因此,我建议使用CALayer作为屏幕目标的渲染,而不是直接使用图形上下文 希望它有所帮助。