CALayer и внеэкранный рендеринг
У меня пейджинг UIScrollView
с достаточно большим содержимым, чтобы вместить несколько маленьких UIScrollViews для масштабирования, 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 ответ
Как я упоминал выше, 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;
}