CALayer和Off-Screen渲染 [英] CALayer and Off-Screen Rendering
问题描述
我有一个Paging UIScrollView
,内容大小足以容纳一些小的UIScrollViews缩放, viewForZoomingInScrollView
是一个viewController,用于保存用于绘制PDF页面的CALayer。这使我可以通过PDF浏览,就像ibooks PDF阅读器。
绘制PDF(Tiled Layers)的代码位于:
- (void)drawLayer:(CALayer *)layer inContext:(CGContextRef)ctx;
只需在可见屏幕上添加页面即可自动调用此方法。当我更改页面时,即使已经创建了对象(页面),在所有图块都绘制之前仍存在一些延迟。
我想要做什么在用户滚动到它之前呈现下一页,从而防止可见的平铺效果。但是,我发现,如果图层位于屏幕外添加到scrollview不调用 drawLayer
。
这里有任何想法/常见问题吗?
我试过:
[viewController.view.layer setNeedsLayout];
[viewController.view.layer setNeedsDisplay];
注意:这是复制ibooks的功能的事实是不相关的完整的应用程式。
如上所述,如果CALAYERS在屏幕外, >
我最终不是直接将PDF绘制到图层,而是在需要时将PDF页面渲染为图像(渲染1页加减一个关注页面) / p>
这是渲染代码:
- (UIImage *)renderPDFPageToImage :(int)pageNumber // NSOPERATION?
{
//你可能不想永久(app life)保留文档ref
CGSize size = CGSizeMake(x,y);
UIGraphicsBeginImageContext(size);
CGContextRef context = UIGraphicsGetCurrentContext();
CGContextTranslateCTM(context,0,750);
CGContextScaleCTM(context,1.0,-1.0);
CGPDFPageRef页面; // Move to class member
page = CGPDFDocumentGetPage(myDocumentRef,pageNumber);
CGContextDrawPDFPage(context,page);
UIImage * pdfImage = UIGraphicsGetImageFromCurrentImageContext(); // autoreleased
UIGraphicsEndImageContext();
return pdfImage;
}
I have a Paging UIScrollView
with a contentSize large enough to hold a number of small UIScrollViews for zooming, The viewForZoomingInScrollView
is a viewController that holds a CALayer for drawing a PDF page onto. This allows me to navigate through a PDF much like the ibooks PDF reader.
The code that draws the PDF (Tiled Layers) is located in:
- (void)drawLayer:(CALayer *)layer inContext:(CGContextRef)ctx;
And simply adding a 'page' to the visible screen calls this method automatically. When I change page there is some delay before all the tiles are drawn, even though the object (page) has already been created.
What i want to be able to do is render the next page before the user scrolls to it, thus preventing the visible tiling effect. However, i have found that if the layer is located offscreen adding it to the scrollview doesn't call the drawLayer
.
Any Ideas/common gotchas here?
I have tried:
[viewController.view.layer setNeedsLayout];
[viewController.view.layer setNeedsDisplay];
NB: The fact that this is replicating the ibooks functionally is irrelevant within the context of the full app.
As i mentioned above, CALayers don't render if they are offscreen.
I ended up not drawing the PDF directly to the layer but instead, rendered the PDF page to an image when i needed (renders 1 page plus and minus one of the focused page)
Here is the render code:
-(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;
}
这篇关于CALayer和Off-Screen渲染的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!