2010-09-30 6 views
8

Ho un cercapersone UIScrollView con un contentSize grande abbastanza da contenere un numero di piccole UIScrollViews per lo zoom, Lo viewForZoomingInScrollView è un viewController che contiene un CALayer per disegnare una pagina PDF. Questo mi permette di navigare attraverso un PDF molto simile al lettore PDF di ibooks.CALayer e Off-Screen Rendering

Il codice che disegna il PDF (Layers piastrelle) si trova in:

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

E la semplice aggiunta di una 'pagina' alla schermata visibile chiama questo metodo automaticamente. Quando cambio pagina, c'è qualche ritardo prima che tutte le tessere vengano disegnate, anche se l'oggetto (pagina) è già stato creato.

Quello che voglio essere in grado di fare è rendere la pagina successiva prima che l'utente vi scorra, impedendo così l'effetto di piastrellatura visibile. Tuttavia, ho scoperto che se il livello si trova fuori schermo aggiungendolo alla scrollview non si chiama il numero drawLayer.

Qualche idea/bagaglio comune qui?

ho provato:

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

NB: Il fatto che questo sta replicando i iBook funzionalmente è irrilevante nel contesto della piena applicazione.

risposta

7

Come accennato in precedenza, i CALayer non eseguono il rendering se sono fuori schermo.

ho finito per non disegnare il PDF direttamente al livello, ma invece, rese la pagina PDF a un'immagine quando ho bisogno (intonaci 1 pagina più e meno uno della pagina focalizzata)

Qui è il codice di rendering :

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

È necessario chiamare 'UIGraphicsEndImageContext' prima di tornare. – Jason

+1

grazie per la cattura Jason –