首页 文章

CALayer和离屏渲染

提问于
浏览
8

我有一个Paging UIScrollView ,其contentSize足以容纳一些小的UIScrollViews进行缩放, 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 回答

  • 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;
    
    }
    

相关问题