UITableView到PDF有很多页面(无法生成)

时间:2016-07-25 09:47:41

标签: ios swift uitableview pdf ios8

我正在尝试从tableView的整个内容生成PDF。我尝试过(我认为)来自stackoverflow的所有示例,它们仅适用于tableView的行适合单个pdf页面的情况。无法生成包含多于1页的任何数据。

目前使用此代码段:(抱歉,不记得作者)

        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,animated:false) 评论它,所有页面都生成但只有第一个页面有内容。当像这样离开时,在activityViewController-&gt;打印预览无休止地加载预览

我也尝试渲染单元的contentView,但是当迭代通过tableView.subviews时,它只包含可见单元格的视图

1 个答案:

答案 0 :(得分:0)

即使内容不可见,我也为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快得多。