Apple ofrece un montón de métodos en el nivel CoreGraphics
para dibujar contenido PDF directamente. Hasta donde yo sé, nada de eso está bien empaquetado en el nivel UIKit
, por lo que puede no ser una buena opción para su proyecto en este momento, especialmente si no está tan cómodo en el nivel C. Sin embargo, la función relevante es CGContextDrawPDFPage;
por la forma normal de CoreGraphics
Existen otros métodos para crear una referencia de PDF desde una fuente de datos y luego obtener una referencia de página de un PDF. Luego deberá ocuparse de escalar y traducir a la vista que desee, y tenga en cuenta que deberá realizar una inversión horizontal porque los archivos PDF (y OS X) usan la parte inferior izquierda como origen, mientras que iOS usa la parte superior izquierda . código de ejemplo, la parte superior de mi cabeza:
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;
En una conjetura, es probable que quieren usar CGPDFPageGetBoxRect(pageRef, kCGPDFCropBox)
conseguir cuadro de recorte de la página y luego encontrar la manera de escalar/mover de que para adaptarse a su tamaño de la imagen .
Probablemente más fácil para sus propósitos es el método -renderInContext:
en CALayer
(ver QA 1703) - los antiguos medios de conseguir una captura de pantalla fue UIGetScreenImage
, pero que nunca fue realmente API oficial y fue aparentemente temporalmente autorizada sólo por la aprobación accidental de RedLaser . Con el código en el control de calidad, puede prepararse para obtener un UIImage desde cualquier otra vista sin que esa vista tenga que estar en la pantalla. ¿Cuál posiblemente resuelve algunos de tus problemas con la captura de pantalla? Aunque eso significa que solo puedes soportar OS 4.x.
En cualquier caso, los archivos PDF simplemente no dibujan tan rápido. Probablemente necesite llenar la tabla y luego dibujar las miniaturas en una cadena de fondo, empujándolas hacia arriba cuando esté disponible. En realidad, no puedes usar objetos UIKit de forma segura en los hilos de fondo, pero todas las cosas de CoreGraphics
son seguras.
Hola alones, estoy usando el código para obtener miniaturas PDF. Parece que la línea CGContextConcatCTM (context, pdfTransform) produce un cuello de botella de memoria, descubrí que si dejo esta línea, entonces está bien. Pero no puedo dejarlo porque necesito esto para una miniatura adecuada. ¿Tienes alguna idea de cómo podemos mejorar esto? Thx por cierto ... – aslisabanci
este funciona para mí ... el de arriba no sé por qué pero generó una miniatura ficticia o basura ... gracias ... – Underdog
doc decir UIGraphicsGetImageFromCurrentImageContext() no es seguro –