CALayer и внеэкранный рендеринг - PullRequest
8 голосов
/ 30 сентября 2010

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

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

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

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

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

Есть здесь какие-нибудь идеи / общие вопросы?

Я пытался:

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

NB. Тот факт, что это функционально дублирует ibook, не имеет значения в контексте полного приложения.

1 Ответ

8 голосов
/ 04 октября 2010

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

}
...