cocoa-touch - CALayer 和离屏渲染

标签 cocoa-touch ipad uiscrollview quartz-graphics calayer

我有一个分页 UIScrollView具有足够大的 contentSize 以容纳许多用于缩放的小型 UIScrollViews viewForZoomingInScrollView是一个 View Controller ,它包含一个 CALayer,用于在其上绘制 PDF 页面。这使我可以像 ibooks PDF 阅读器一样浏览 PDF。

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

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

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

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

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

我试过了:
[viewController.view.layer setNeedsLayout]; 
[viewController.view.layer setNeedsDisplay];

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

最佳答案

正如我上面提到的,如果 CALayer 不在屏幕上,它们就不会渲染。

我最终没有将 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;

}

关于cocoa-touch - CALayer 和离屏渲染,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3831304/

相关文章:

iphone - 模糊图像的一部分

javascript - 防止父项默认触摸移动,但子项不默认

ios - 选择器 View 的行为

iphone - UIScrollView 自动布局 - 内容大小设置不正确

ios - 如何仅在委托(delegate)(继承)中快速指定可用性?

ios - 为什么我得到 "Permission Denied"

ios - 如何在iOS上的UIImagePicker中获取实际图像帧的大小?

objective-c - iOS如何通过一个循环将多个事件添加到日历

ios - 为 uitableview 创建边框

ios - 改变方向时 UIScrollView 的大小