我正在尝试从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时,它只包含可见单元格的视图
答案 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
快得多。