UIGraphicsGetCurrentContext似乎返回nil

Chr*_*men 16 pdf ios

我试图在这里将单个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

就我而言,这就是下一行返回的上下文为空的原因.

  • 是的,我的问题是尺寸是CGSizeZero (3认同)

doc*_*uke 29

你在drawRect方法中调用UIGraphicsGetCurrentContext()吗?据我所知,它只能在drawRect中调用,否则它只返回nil.


ETe*_*ech 2

事实上,在 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 作为屏幕目标的渲染,而不是直接使用图形上下文。
希望能帮助到你。