2016-07-25 2 views
0

Я пытаюсь создать PDF из всего содержимого tableView. Я пробовал (я думаю) все примеры из stackoverflow, и они работают только в том случае, когда таблицы tableView помещаются в одну страницу PDF. Любые данные, содержащие более 1 страницы, не могут быть сгенерированы.UITableView в PDF со многими страницами (невозможно сгенерировать)

В настоящее время, используя этот фрагмент: (извините, не помню автора)

 var pdfData = NSMutableData() 
     UIGraphicsBeginPDFContextToData(pdfData, CGRectMake(0, 0, 612,792), nil); 
     UIGraphicsBeginPDFPage(); 
     self.view.layer.renderInContext(UIGraphicsGetCurrentContext()!) 
     self.tableView.scrollRectToVisible(CGRectMake(0, 0, 1, 1), animated:false) 
     self.tableView.layer.renderInContext(UIGraphicsGetCurrentContext()!) 

     let screensInTable:CGFloat = self.tableView.contentSize.height/self.tableView.frame.height; 
     print("how many screens: \(screensInTable)") 
     for i in 1..<Int(screensInTable) { 
      let contentOffset = CGPointMake(0, CGFloat(i) * 100)//self.tableView.frame.height 
      print("content offset: \(contentOffset)") 
      self.tableView.setContentOffset(contentOffset, animated:false) 
      self.tableView.layer.renderInContext(UIGraphicsGetCurrentContext()!) 
     } 

     UIGraphicsEndPDFContext(); 

     let activityViewController = UIActivityViewController(activityItems: [pdfData], applicationActivities: nil) 
     dispatch_async(dispatch_get_main_queue(), { 

      self.presentViewController(activityViewController, animated: false, completion: nil) 
     }) 

Проблема заключается в в строке: self.tableView.setContentOffset (contentOffset, анимированные: ложь) комментируя это, все страницы , но только первый имеет контент. при выходе, как это, в activityViewController-> предварительный просмотр печати бесконечно загрузки превью

Я также пытался оказать одного contentView ячейки, но при переборе tableView.subviews содержит только вид видимых ячеек

ответ

0

I создали PDF-файл для tableView, даже если контент не был виден.

Основная логика использует

CGContextTranslateCTM(UIGraphicsGetCurrentContext(), rect.origin.x, -rect.origin.y);

Если y значений переводятся в отрицательна, то сдвиги самого содержания вверх, так что вы можете сделать снимок следующего набора. Если нет, вы просто получите только снимок экрана.

Ниже приведен фрагмент кода, который я использовал для создания изображения из Tableview

func getScreenShot(aView : UIView, forRect rect : CGRect) -> UIImage { 
    // Preserve the previous frame and contentOffset of the scrollView (tableView) 
    let frame = aView.frame 
    var offset : CGPoint? 

    // Get offset only if view is scrollView 
    if let aView = aView as? UIScrollView { 
     offset = aView.contentOffset 
    } 

    UIGraphicsBeginImageContextWithOptions(rect.size, false, UIScreen.mainScreen().scale) 

    // Move the frame for the screenshot starting position 
    CGContextTranslateCTM(UIGraphicsGetCurrentContext(), rect.origin.x, -rect.origin.y); 

    // Set the new size for the view 
    aView.frame.size = rect.size 

    // Set the new contentOffset for the view only if it's a scrollView 
    if let aView = aView as? UIScrollView { 
     aView.contentOffset.y = rect.origin.y 
    } 

    aView.drawViewHierarchyInRect(rect, afterScreenUpdates: true) 

    let image = UIGraphicsGetImageFromCurrentImageContext() 
    UIGraphicsEndImageContext() 

    // Reset the previous frame 
    aView.frame = frame 

    // Reset offset only if view is scrollView 
    if let aView = aView as? UIScrollView { 
     aView.contentOffset = offset! 
    } 

    return image 
} 

Вы можете изменить это, чтобы ваши потребности. Кроме того, я хотел бы предложить вам использовать

drawViewHierarchyInRect(rect, afterScreenUpdates: true)

если вы поддерживаете IOS 7 и выше, потому что это намного быстрее, чем renderInContext.

+0

все еще не работает к сожалению :(закончил создание html и отправил его в виде отчета – repoguy

Смежные вопросы