我试图在这里将单个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);
Run Code Online (Sandbox Code Playgroud)
任何人都知道还有什么可能导致零上下文?
Mat*_*att 43
它不必从"drawRect"调用.你也可以在"UIGraphicsBeginImageContext(bRect.size);"之后调用它.
检查以下行
UIGraphicsBeginImageContext(bRect.size);
Run Code Online (Sandbox Code Playgroud)
如果bRect.size不是0,0
就我而言,这就是下一行返回的上下文为空的原因.
事实上,在 drawRect 方法中设置 CGContextRef 对象后,可以重用它。要点是 - 在从任何地方使用 Context 之前,您需要将其推送到堆栈。否则,当前上下文将为 0x0
1. 添加
@interface RenderView : UIView {
CGContextRef visualContext;
BOOL renderFirst;
}
Run Code Online (Sandbox Code Playgroud)
2. 在您的 @implementation 中,在视图出现在屏幕上之前,首先将 renderFirst 设置为 TRUE,然后:
-(void) drawRect:(CGRect) rect {
if (renderFirst) {
visualContext = UIGraphicsGetCurrentContext();
renderFirst = FALSE;
}
}
Run Code Online (Sandbox Code Playgroud)
3. 设置上下文后将Something渲染到上下文中。
-(void) renderSomethingToRect:(CGRect) rect {
UIGraphicsPushContext(visualContext);
// For instance
UIGraphicsPushContext(visualContext);
CGContextSetRGBFillColor(visualContext, 1.0, 1.0, 1.0, 1.0);
CGContextFillRect(visualContext, rect);
}
Run Code Online (Sandbox Code Playgroud)
这是一个与线程情况完全匹配的示例:
- (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();
}
Run Code Online (Sandbox Code Playgroud)
并从本文之前拍摄的上下文中绘制图像:
-(void) drawImageOnContext: (CGImageRef) someIm onPosition: (CGPoint) aPos {
UIGraphicsPushContext(visualContext);
CGContextDrawImage(visualContext, CGRectMake(aPos.x,
aPos.y, someIm.size.width,
someIm.size.height), someIm.CGImage);
}
Run Code Online (Sandbox Code Playgroud)
在需要上下文来渲染对象之前,不要调用 UIGraphicsPopContext() 函数。
当调用方法完成时,CGContextRef 似乎会自动从图形堆栈的顶部删除。
不管怎样,这个例子似乎是一种Hack——不是苹果公司计划和提出的。该解决方案非常不稳定,并且仅适用于屏幕顶部的一个 UIView 内的直接方法消息调用。在“performselection”调用的情况下,Context 不会将任何结果呈现到屏幕上。因此,我建议使用 CALayer 作为屏幕目标的渲染,而不是直接使用图形上下文。
希望能帮助到你。
| 归档时间: |
|
| 查看次数: |
19447 次 |
| 最近记录: |