如何以PDF格式获取UITableView的快照

我有一个UITableView ,其中填充了一些数据但由于它包含的数据比屏幕的可视区域更多,我只能设法得到它的快照,我想知道是否还有其他方法我可以以PDF格式获取整个tableview快照。这是我尝试过的感谢

 - (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 captured 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]; } 

 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"]; 

我不知道,但这段代码对我来说就像一个魅力..

这是你如何在不滚动tableview的情况下完成的。 只需将scrollview的高度增加到contentSize即可。 如果你不通过UIImage ,PDF的质量也会更好。 这是来自我在Swift中的UITableView扩展。 代码是从这里和那里偷来的,所以评论并不总是我的。

 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 captured 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 } 

没有屏幕外细胞,因为它们一旦滚出可见屏幕就会被回收。 而是截取UITableView,您应该考虑使用Core Text创建PDF版本。 也许你可以适应这个例子 。

基于Vin的答案(也可用于快照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(); 

我想每个人都会忘记UITableView毕竟是一个UIScrollView 。 无需计算单元格,高度等。您可以使用contentSize创建上下文,设置tableView.frame.size = tableView.contentSize并在上下文中进行渲染。

请看这个例子

  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()