UITableView与许多页面的PDF(不能生成)

问题描述:

我想从tableView的整个内容生成PDF。我试过(我认为)从*所有的例子,他们只工作在tableView的行适合单个pdf页面的情况下。任何包含多于一页的数据都不能生成。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->打印预览不休加载预览

我还试图渲染单元的单内容查看,而是通过tableView.subviews进行遍历时,它仅包含视图中可见细胞

我的即使内容不可见,也为tableView生成了PDF。

主要逻辑是使用

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