【问题标题】:CALayer and Off-Screen RenderingCALayer 和屏幕外渲染
【发布时间】:2011-04-19 09:07:38
【问题描述】:

我有一个 Paging UIScrollView,其 contentSize 足够大,可以容纳许多用于缩放的小型 UIScrollView,viewForZoomingInScrollView 是一个 viewController,它拥有一个用于在其上绘制 PDF 页面的 CALayer。这让我可以像 ibooks PDF 阅读器一样浏览 PDF。

绘制PDF(Tiled Layers)的代码位于:

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

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

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

这里有什么想法/常见的陷阱吗?

我试过了:

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

注意:这在功能上复制 ibook 的事实与整个应用程序的上下文无关。

【问题讨论】:

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


    【解决方案1】:

    正如我上面提到的,如果 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;
    
    }
    

    【讨论】:

    • 您需要在返回前致电UIGraphicsEndImageContext
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-10-02
    • 2012-12-11
    • 1970-01-01
    • 2015-04-08
    • 1970-01-01
    • 2016-06-25
    • 1970-01-01
    相关资源
    最近更新 更多