Apple предоставляет целый ряд методов на уровне CoreGraphics
для непосредственного рисования содержимого PDF.Насколько я знаю, ни один из них не был аккуратно упакован на уровне UIKit
, так что он может не подходить для вашего проекта на данный момент, особенно если вам не так комфортно на уровне C,Тем не менее, соответствующая функция - CGContextDrawPDFPage;
для обычного способа CoreGraphics
. Существуют и другие методы для создания ссылки на PDF из источника данных, а затем для получения ссылки на страницу из PDF.Затем вам нужно будет заняться масштабированием и переводом в нужное вам представление и получить предупреждение о том, что вам необходимо выполнить горизонтальное переворачивание, поскольку PDF-файлы (и OS X) используют нижний левый угол в качестве исходного, тогда как iOS использует верхний левый,Пример кода от макушки головы:
UIGraphicsBeginImageContext(thumbnailSize);
CGPDFDocumentRef pdfRef = CGPDFDocumentCreateWithProvider( (CGDataProviderRef)instanceOfNSDataWithPDFInside );
CGPDFPageRef pageRef = CGPDFDocumentGetPage(pdfRef, 1); // get the first page
CGContextRef contextRef = UIGraphicsGetCurrentContext();
// ignore issues of transforming here; depends on exactly what you want and
// involves a whole bunch of normal CoreGraphics stuff that is nothing to do
// with PDFs
CGContextDrawPDFPage(contextRef, pageRef);
UIImage *imageToReturn = UIGraphicsGetImageFromCurrentImageContext();
// clean up
UIGraphicsEndImageContext();
CGPDFDocumentRelease(pdfRef);
return imageToReturn;
Возможно, вы, вероятно, захотите использовать CGPDFPageGetBoxRect(pageRef, kCGPDFCropBox)
, чтобы получить рамку обрезки страницы, а затем решить, как масштабировать / переместить ее всоответствует размеру вашего изображения.
Вероятно, для ваших целей проще использовать метод -renderInContext:
для CALayer
(см. QA 1703 ) - старым способом получения скриншота было UIGetScreenImage
,но это никогда не было действительно официальным API и казалось временно разрешенным только из-за случайного одобрения RedLaser.С помощью кода в QA вы можете настроить себя так, чтобы получить UIImage из любого другого представления без необходимости отображения этого на экране.Что, возможно, решает некоторые ваши проблемы с захватом экрана?Хотя это означает, что вы можете поддерживать только OS 4.x.
В любом случае PDF-файлы просто не отрисовываются так быстро.Вам, вероятно, нужно заполнить таблицу, а затем нарисовать миниатюры в фоновом потоке, подталкивая их вверх, когда они доступны.На самом деле вы не можете безопасно использовать объекты UIKit в фоновых потоках, но все вещи CoreGraphics
безопасны.