2013-04-16 2 views
6

У меня есть UITableView, который заполнен некоторыми данными, но поскольку он содержит данные, которые содержат больше ячеек, чем область просмотра на экране, мне удалось получить только снимок это, я хочу знать, есть ли какой-либо другой способ, я могу получить весь Tableview снимок в pdf..this то, что я пытался благодаряКак получить снимок UITableView в формате PDF

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

ответ

14
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

Nice! Я не знал этого, вы должны принять свой собственный ответ, – Jano

+1

Привет, Спасибо за этот код. Я изо всех сил пытаюсь это сделать. Я не уверен, что я делаю неправильно. Я использовал этот код, но он не работает после прокрутки таблицы. Можете ли вы, пожалуйста, проверить мой вопрос и дать свои мысли? -http: //stackoverflow.com/questions/17771112/ios-rendering-uitableview-into-pdf Было бы очень благодарно. – applefreak

+0

Спасибо, очень полезно, также не забывайте, что UITableView унаследован от UIScrollView, поэтому можно сделать такую ​​вещь: CGFloat screensInTable = self.tableView.contentSize.height/self.tableView.frame.size.height; for (int i = 1; i

2

там нет ни одного закадровых клеток, потому что они возвращают, как только они прокрутите экран с экрана. Вместо снимков экрана UITableView вы должны рассмотреть возможность создания PDF-версии с использованием Core Text. Возможно, вы можете адаптировать этот example.

+0

благодарит за information..i получил небольшой кусок кода, который помогает мне сделать процесс снимка, посмотрите на мой код – vin

1

На основании ответа Вина (также могут быть использованы для мгновенных снимков 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(); 
3

Вот как вы можете сделайте это без прокрутки таблицы. Просто увеличьте высоту прокрутки до contentSize. Качество PDF также лучше, если вы не пройдете через UIImage. Это из моего расширения UITableView в Swift. Код украден отсюда и там, поэтому комментарии не всегда мои.

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 
} 
+0

Кажется, что это работает, но когда я это делаю, он фиксирует 1 и половину строки сверху и снизу – vinbhai4u

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() 
Смежные вопросы