2010-09-30 92 views
8

我有一個頁面UIScrollView,其contentSize足夠容納大量的小型UIScrollViews進行縮放,viewForZoomingInScrollView是一個viewController,它包含一個用於繪製PDF頁面的CALayer。這使我可以像瀏覽ibooks PDF閱讀器一樣瀏覽PDF。CALayer和離屏渲染

繪製的PDF(平鋪層)的代碼位於:

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

,只需添加一個「頁面」可視屏幕自動調用此方法。當我更改頁面時,即使已經創建了對象(頁面),在繪製所有圖塊之前仍有一些延遲。

我希望能夠做的是在用戶滾動到它之前呈現下一頁,從而防止出現可見的拼貼效果。但是,我發現如果圖層位於屏幕外,將其添加到滾動視圖不會調用drawLayer

任何想法/常見陷阱?

我曾嘗試:

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

注:這個功能是複製的iBooks的事實是完整的應用程序的範圍內無關。

回答

7

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

} 
+2

您需要在返回之前調用'UIGraphicsEndImageContext'。 – Jason 2010-10-09 20:07:40

+1

謝謝你的傑森 – 2010-10-10 14:06:00