我有一个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];
}
答案 0 :(得分:17)
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"];
我不知道,但这段代码对我来说就像一个魅力..
答案 1 :(得分:5)
如果不滚动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
}
答案 2 :(得分:2)
没有屏幕外细胞,因为它们一旦滚出可见屏幕就会被回收。而是截取UITableView,您应该考虑使用Core Text创建PDF版本。也许你可以调整这个example。
答案 3 :(得分:1)
基于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();
答案 4 :(得分:0)
我认为每个人都会忘记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()