【问题标题】:Drawing a PDF Right-Side-Up in CGContext在 CGContext 中绘制 PDF 正面朝上
【发布时间】:2010-03-17 02:37:34
【问题描述】:

我正在覆盖自定义 UIView 中的 drawRect: 方法,并且正在做一些自定义绘图。一切进展顺利,直到我需要在上下文中绘制一个 PDF 资源(准确地说是矢量字形)。首先,我从文件中检索 PDF:

NSURL *pdfURL = [NSURL fileURLWithPath:[[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@"CardKit.bundle/A.pdf"]];
CGPDFDocumentRef pdfDoc = CGPDFDocumentCreateWithURL((CFURLRef)pdfURL);
CGPDFPageRef pdfPage = CGPDFDocumentGetPage(pdfDoc, 1);

然后我创建一个与加载的 PDF 具有相同尺寸的框:

CGRect box = CGPDFPageGetBoxRect(pdfPage, kCGPDFArtBox);

然后我保存我的图形状态,这样我就不会搞砸了:

CGContextSaveGState(context);

然后我执行 CTM 的缩放+翻译,理论上翻转整个上下文:

CGContextScaleCTM(context, 1.0, -1.0);
CGContextTranslateCTM(context, 0.0, rect.size.height);

然后我缩放 PDF 以使其适合视图:

CGContextScaleCTM(context, rect.size.width/box.size.width, rect.size.height/box.size.height);

最后,我绘制 PDF 并恢复图形状态:

CGContextDrawPDFPage(context, pdfPage);
CGContextRestoreGState(context);

问题是没有任何可见的绘制。所有这些代码理论上都应该将 PDF 字形绘制到视图中,对吧?

如果我删除用于翻转上下文的比例+平移,它会完美绘制:它只是颠倒绘制。

有什么想法吗?

【问题讨论】:

    标签: iphone objective-c cocoa cocoa-touch


    【解决方案1】:

    尝试在缩放之前进行翻译:

    CGContextTranslateCTM(context, 0.0, rect.size.height);
    CGContextScaleCTM(context, 1.0, -1.0);
    

    【讨论】:

    • 恐怕这会产生完全相同的结果。
    • Carter Allen:我已更正的代码应该可以正常工作。平移然后缩放正是翻转(或者,在这种情况下,取消翻转)坐标系所需要做的。
    • 是的,这段代码是我在一些应用程序中用来翻转 Quartz 绘图的,所以它应该可以工作。
    • 再次:我正在使用那个确切的代码。它导致一个空视图。我不确定出了什么问题,但是没有这两行,它可以正确绘制,只是颠倒了。
    • Peter 更正的代码(谢谢,顺便说一句,我忘了换行!)在这里肯定有效。您可以发布您的drawRect: 方法的完整代码吗?
    【解决方案2】:
    CGContextTranslateCTM(context, 0, self.bounds.size.height);
    CGContextScaleCTM(context, 1.0, -1.0);
    
    CGPDFPageRef page = CGPDFDocumentGetPage(pdf, currentPage);
    CGContextSaveGState(context);
    
    
    
    
    CGRect box = CGPDFPageGetBoxRect(page, kCGPDFMediaBox);
    
    CGContextScaleCTM(context, self.bounds.size.width/box.size.width, self.bounds.size.height/box.size.height);
    CGContextDrawPDFPage(context, page);
    CGContextRestoreGState(context);
    

    这是您问题的正确答案

    【讨论】:

      【解决方案3】:

      为了在翻译前进行缩放,我认为我们可以在翻译时加上减号。

      CGContextScaleCTM(context, 1.0, -1.0);
      CGContextTranslateCTM(context, 0.0, -rect.size.height);
      

      【讨论】:

        【解决方案4】:

        这对我来说一切都颠倒过来了:

        pdfDisplayView.layer.geometryFlipped = YES; //(NO) 
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-09-20
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多