CALayer和离屏渲染

时间:2010-09-30 14:03:39

标签: cocoa-touch ipad uiscrollview quartz-graphics calayer

我有一个分页UIScrollView,其内容大小足以容纳一些小的UIScrollView用于缩放,viewForZoomingInScrollView是一个viewController,它包含一个用于绘制PDF页面的CALayer。这使我可以像ibooks PDF阅读器一样浏览PDF。

绘制PDF(平铺图层)的代码位于:

- (void)drawLayer:(CALayer *)layer inContext:(CGContextRef)ctx;

只需在可见屏幕上添加“页面”即可自动调用此方法。当我更改页面时,在绘制所有图块之前会有一些延迟,即使已经创建了对象(页面)。

我希望能够做的是在用户滚动到下一页之前渲染下一页,从而防止可见的平铺效果。但是,我发现如果图层位于屏幕外,将其添加到滚动视图不会调用drawLayer

这里有任何想法/常见问题吗?

我试过了:

[viewController.view.layer setNeedsLayout]; 
[viewController.view.layer setNeedsDisplay];

注意:这是在功能上复制ibooks的事实在完整应用程序的上下文中无关紧要。

1 个答案:

答案 0 :(得分:8)

如上所述,如果CALayers在屏幕外,则不会渲染。

我最终没有将PDF直接绘制到图层,而是在需要时将PDF页面渲染为图像(渲染1页加减焦点的一页)

这是渲染代码:

-(UIImage *)renderPDFPageToImage:(int)pageNumber//NSOPERATION?
{
 //you may not want to permanently (app life) retain doc ref

 CGSize size = CGSizeMake(x,y);     
 UIGraphicsBeginImageContext(size);
 CGContextRef context = UIGraphicsGetCurrentContext();

 CGContextTranslateCTM(context, 0, 750);
 CGContextScaleCTM(context, 1.0, -1.0);

 CGPDFPageRef page;  //Move to class member 

    page = CGPDFDocumentGetPage (myDocumentRef, pageNumber);
    CGContextDrawPDFPage (context, page);

 UIImage * pdfImage = UIGraphicsGetImageFromCurrentImageContext();//autoreleased
 UIGraphicsEndImageContext();
 return pdfImage;

}
相关问题