Cómo get una instantánea de UITableView en formatting PDF

Tengo una UITableView que está llena de datos pero, dado que contiene datos que son más celdas que el área visible de la pantalla, solo logré get solo la instantánea, quiero saber si hay alguna otra forma que pueda get la instantánea de vista de tabla en formatting pdf … esto es lo que he intentado gracias

 - (IBAction)clickMe:(id)sender { UIView *viewToRender = self.myTableView; CGPoint contentOffset = self.myTableView.contentOffset; UIGraphicsBeginImageContext(viewToRender.bounds.size); CGContextRef ctx = UIGraphicsGetCurrentContext(); // KEY: need to translate the context down to the current visible portion of the tablview CGContextTranslateCTM(ctx, 0, -contentOffset.y); [viewToRender.layer renderInContext:ctx]; UIImage *image = UIGraphicsGetImageFromCurrentImageContext(); UIImageView *myImage=[[UIImageView alloc]initWithImage:image]; UIGraphicsEndImageContext(); [self createPDFfromUIViews:myImage saveToDocumentsWithFileName:@"PDF Name"]; } - (void)createPDFfromUIViews:(UIView *)myImage saveToDocumentsWithFileName:(NSString *)string { NSMutableData *pdfData = [NSMutableData data]; UIGraphicsBeginPDFContextToData(pdfData, myImage.bounds, nil); UIGraphicsBeginPDFPage(); CGContextRef pdfContext = UIGraphicsGetCurrentContext(); // draws rect to the view and thus this is captunetworking by UIGraphicsBeginPDFContextToData [myImage.layer renderInContext:pdfContext]; // remove PDF rendering context UIGraphicsEndPDFContext(); NSArray* documentDirectories = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask,YES); NSString* documentDirectory = [documentDirectories objectAtIndex:0]; NSString* documentDirectoryFilename = [documentDirectory stringByAppendingPathComponent:string]; NSLog(@"%@",documentDirectoryFilename); [pdfData writeToFile:documentDirectoryFilename atomically:YES]; } 

Solutions Collecting From Web of "Cómo get una instantánea de UITableView en formatting PDF"

 UIGraphicsBeginImageContext(self.myTableView.contentSize); [self.myTableView scrollToRowAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:0] atScrollPosition:UITableViewScrollPositionTop animated:NO]; [self.myTableView.layer renderInContext:UIGraphicsGetCurrentContext()]; int rows = [self.myTableView numberOfRowsInSection:0]; int numberofRowsInView = 4; for (int i =0; i < rows/numberofRowsInView; i++) { [self.myTableView scrollToRowAtIndexPath:[NSIndexPath indexPathForRow:(i+1)*numberofRowsInView inSection:0] atScrollPosition:UITableViewScrollPositionTop animated:NO]; [self.myTableView.layer renderInContext:UIGraphicsGetCurrentContext()]; } UIImage *image = UIGraphicsGetImageFromCurrentImageContext(); UIImageView *myImage=[[UIImageView alloc]initWithImage:image]; UIGraphicsEndImageContext(); [self createPDFfromUIViews:myImage saveToDocumentsWithFileName:@"PDF Name"]; 

No lo sé, pero este código funciona como un encanto para mí.

A continuación, le indicamos cómo puede hacerlo sin desplazarse por la vista de tabla. Simplemente aumente la altura de la vista de desplazamiento a contentSize. La calidad del PDF también es mejor si no UIImage un UIImage . Esto es de mi extensión UITableView en Swift. El código es robado de aquí y allá, por lo que los comentarios no siempre son míos.

 func toPDF(fileName: String) -> String { // Don't include scroll indicators in file self.showsVerticalScrollIndicator = false // Creates a mutable data object for updating with binary data, like a byte array let pdfData = NSMutableData() // Change the frame size to include all data let originalFrame = self.frame self.frame = CGRectMake(self.frame.origin.x, self.frame.origin.y, self.contentSize.width, self.contentSize.height) // Points the pdf converter to the mutable data object and to the UIView to be converted UIGraphicsBeginPDFContextToData(pdfData, self.bounds, nil) UIGraphicsBeginPDFPage() let pdfContext = UIGraphicsGetCurrentContext(); // Draws rect to the view and thus this is captunetworking by UIGraphicsBeginPDFContextToData self.layer.renderInContext(pdfContext!) // Remove PDF rendering context UIGraphicsEndPDFContext() // Retrieves the document directories from the iOS device let documentDirectories: NSArray = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true) let documentDirectory = documentDirectories.objectAtIndex(0) let documentDirectoryFilename = documentDirectory.stringByAppendingPathComponent(fileName); // Instructs the mutable data object to write its context to a file on disk pdfData.writeToFile(documentDirectoryFilename, atomically: true) // Back to normal size self.frame = originalFrame // Put back the scroll indicator self.showsVerticalScrollIndicator = true return documentDirectoryFilename } 

No hay celdas fuera de la pantalla porque se reciclan tan pronto como se desplazan fuera de la pantalla visible. En lugar de hacer una captura de pantalla de UITableView, debe considerar crear una versión en PDF usando Core Text. Tal vez puedas adaptar este ejemplo .

Basado en la respuesta de Vin (también se puede usar para capturar instantáneas de UIScrollViews):

  UIGraphicsBeginPDFContextToData(pdfData, CGRectMakeWithSize(0, 0, self.productsTable.contentSize), nil); UIGraphicsBeginPDFPage(); [self.view.layer renderInContext:UIGraphicsGetCurrentContext()]; [self.productsTable scrollRectToVisible:CGRectMake(0, 0, 1, 1) animated:NO]; [self.productsTable.layer renderInContext:UIGraphicsGetCurrentContext()]; CGFloat screensInTable = self.productsTable.contentSize.height / self.productsTable.height; for (int i = 1; i < screensInTable; i++) { CGPoint contentOffset = CGPointMake(0, i * self.productsTable.height); [self.productsTable setContentOffset:contentOffset animated:NO]; [self.productsTable.layer renderInContext:UIGraphicsGetCurrentContext()]; } UIGraphicsEndPDFContext(); 

Creo que todos se olvidan de que UITableView es un UIScrollView después de todo. No hay necesidad de calcular celdas, alturas, etc. Simplemente puede crear su context con tableView.frame.size = tableView.contentSize , establecer tableView.frame.size = tableView.contentSize y renderizar en context.

Vea este ejemplo

  UIGraphicsBeginImageContext(tableView.contentSize) let context = UIGraphicsGetCurrentContext() let cachedOffset = CGPoint(x:tableView.contentOffset.x , y:tableView.contentOffset.y) let cachedFrame = tableView.frame tableView.contentOffset = .zero tableView.frame = CGRect(x: 0, y: 0, width: tableView.contentSize.width, height: tableView.contentSize.height) tableView.layer.render(in: context) tableView.frame = cachedFrame tableView.contentOffset = cachedOffset if let image = UIGraphicsGetImageFromCurrentImageContext() { let imageView = UIImageView(image: image) self.createPDF(fromUIViews:myImage saveToDocumentsWithFileName:"PDF Name") } UIGraphicsEndImageContext()