2010-09-30 6 views
8

J'ai un pagination UIScrollView avec un contentSize suffisamment grand pour contenir un certain nombre de petits UIScrollViews pour le zoom, Le viewForZoomingInScrollView est un viewController qui contient un CALayer pour dessiner une page PDF sur. Cela me permet de naviguer à travers un PDF un peu comme le lecteur PDF ibooks.CALayer et le rendu hors-écran

Le code qui dessine le PDF (Couches carrelés) se trouve dans:

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

Et simplement en ajoutant une « page » à l'écran visible appelle cette méthode automatiquement. Lorsque je change de page, il y a un certain délai avant que toutes les tuiles soient dessinées, même si l'objet (page) a déjà été créé. Ce que je veux être en mesure de faire est de rendre la page suivante avant que l'utilisateur ne défile dessus, empêchant ainsi l'effet de mosaïque visible. Cependant, j'ai trouvé que si le calque est situé hors écran en l'ajoutant à la scrollview n'appelle pas le drawLayer.

Des idées/des pièges courants ici?

J'ai essayé:

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

NB: Le fait que cette réplique la ibooks est fonctionnellement hors de propos dans le contexte de l'application complète.

Répondre

7

Comme je l'ai mentionné ci-dessus, CALayers ne rend pas si elles sont hors écran.

Je fini par ne pas tirer le PDF directement sur la couche, mais au contraire, rendu la page PDF à une image quand je besoin (rend 1 page plus ou moins un de la page ciblée)

Voici le code rendu :

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

Vous devez appeler 'UIGraphicsEndImageContext' avant de retourner. – Jason

+1

merci pour la prise Jason –