2010-03-17 48 views
3

我重写了自定义UIView中的drawRect:方法,并且正在执行一些自定义绘制。一切进展顺利,直到我需要将PDF资源(精确的矢量字形)绘制到上下文中。首先,我检索文件的PDF:在CGContext中绘制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字形绘制到视图中,对吧?

如果我删除scale + translate用于翻转上下文,它会完美绘制:它只是绘制颠倒。

任何想法?

回答

10

尝试做规模前翻译:

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

这将产生完全相同的结果,我害怕。 – 2010-03-17 03:11:18

+0

卡特艾伦:代码,因为我已经纠正它应该工作得很好。翻译,然后缩放正是你需要做的翻转(或在这种情况下,解开)协调系统。 – 2010-03-17 07:03:05

+0

是的,这段代码就是我在一些应用程序中用于翻转Quartz绘图的代码,所以它应该可以工作。 – 2010-03-17 12:37:44

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

这是一个正确回答你的问题

0

要缩放转换之前,我想我们可以把减去转换时。

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

这一切翻转右侧为我:

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