2010-09-30 12 views
8

Ich habe eine Paging UIScrollView mit einer contentSize groß genug, um eine Reihe von kleinen UIScrollViews zum Zoomen zu halten, Die viewForZoomingInScrollView ist eine ViewController, die eine CALayer zum Zeichnen einer PDF-Seite enthält. Dadurch kann ich ähnlich wie der I-Buch-PDF-Reader durch ein PDF-Dokument navigieren.CALayer und Off-Screen Rendering

Der Code, der die PDF (mit Ziegeln gedeckt Layers) zieht befindet sich in:

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

Und einfach eine ‚Seite‘ Hinzufügen von dem sichtbaren Bildschirm ruft automatisch diese Methode. Wenn ich die Seite ändere, gibt es eine Verzögerung, bevor alle Kacheln gezeichnet wurden, obwohl das Objekt (Seite) bereits erstellt wurde.

Ich möchte in der Lage sein, die nächste Seite zu rendern, bevor der Benutzer zu ihm scrollt, wodurch der sichtbare Kacheleffekt verhindert wird. Ich habe jedoch festgestellt, dass das Hinzufügen der Ebene zu der Bildlaufansicht die drawLayer nicht aufruft, wenn die Ebene außerhalb des Bildschirms befindet.

Irgendwelche Ideen/gemeinsame Probleme hier?

Ich habe versucht:

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

NB: Die Tatsache, dass dies die iBooks funktionell im Rahmen des vollständigen App repliziert irrelevant ist.

Antwort

7

Wie oben erwähnt, rendern CALayers nicht, wenn sie offscreen sind.

Ich landete nicht die PDF direkt auf die Ebene zeichnen, sondern stattdessen machte die PDF-Seite ein Bild, wenn ich brauchte (rendert 1 Seite plus und minus einem der fokussierten Seite)

Hier ist der Code übertragen wird :

-(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

Sie müssen 'UIGraphicsEndImageContext' aufrufen, bevor Sie zurückkehren. – Jason

+1

danke für den Fang Jason –