CALayer и Off-Screen Rendering

У меня есть пейджинг UIScrollView с contentSize достаточно большим, чтобы содержать несколько небольших UIScrollView для масштабирования, The viewForZoomingInScrollView - это viewController, который содержит CALayer для рисования страницы PDF. Это позволяет мне перемещаться по PDF файлу так же, как читатель PDF ibooks.

Код, который рисует PDF (Tiled Layers), находится в папке

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

И просто добавление "страницы" на видимый экран автоматически вызывает этот метод. Когда я меняю страницу, есть некоторая задержка, прежде чем все фрагменты будут нарисованы, даже если объект (страница) уже создан.

То, что я хочу сделать, - это отобразить следующую страницу до того, как пользователь прокрутит ее, что предотвратит видимый эффект черепицы. Тем не менее, я обнаружил, что если слой находится вне экрана, добавив его в scrollview, он не вызывает drawLayer.

Любые идеи/общие проблемы здесь?

Я пробовал:

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

NB: тот факт, что это репликация ibooks функционально, не имеет отношения к контексту полного приложения.

Ответы

Ответ 1

Как я уже упоминал выше, 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;

}