2016-07-25 19 views
0

Ich versuche, PDF aus dem gesamten Inhalt von TableView zu generieren. Ich habe versucht (ich denke) alle Beispiele von stackoverflow und sie arbeiten nur in dem Fall wo Tabellenzeilen in einzelne pdf-Seite passt. Alle Daten, die mehr als 1 Seite enthalten, können nicht generiert werden.UITableView zu PDF mit vielen Seiten (kann nicht generiert werden)

mit Aktuell Schnipsel: (sorry, kann mich nicht erinnern den Autor)

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

Das Problem an der Linie ist: self.tableView.setContentOffset (content, animiert: false) es zu kommentieren, alle Seiten werden generiert, aber nur der erste hat Inhalt. wenn wie diese zu verlassen, in activityViewController-> Druckvorschau wird geladen endlos die Vorschau

ich auch einzelne Zelle von content habe versucht zu machen, aber wenn man durch tableView.subviews Iterieren es nur enthält Ansichten von sichtbaren Zellen

Antwort

0

I haben PDF für tableView generiert, auch wenn der Inhalt nicht sichtbar war.

Die Hauptlogik verwendet

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

Wenn die y Werte negativ übersetzt werden, dann nach oben den Inhalt verschiebt sich so, dass Sie den nächsten Satz Snapshot kann. Andernfalls erhalten Sie nur den sichtbaren Screenshot.

Im Folgenden ist der Code-Schnipsel, die ich von Tableview zur Erzeugung von Bild verwendet

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 
} 

Sie können diese Notwendigkeit zu Ihrer ändern. Ich würde auch vorschlagen, dass Sie

drawViewHierarchyInRect(rect, afterScreenUpdates: true)

zu verwenden, wenn Sie iOS 7 und höher, weil es viel schneller als renderInContext sind zu unterstützen.

+0

funktioniert immer noch leider nicht :(endete damit, HTML zu erstellen und es als Bericht zu senden – repoguy