我正在使用iOS Charts(Daniel Gindi)在iOS应用中生成图表,我希望能够生成包含在报告正文中的图表的PDF报告。任何人都可以解释如何去做这件事。理想情况下,我不想从应用程序中显示的UIView生成图像,因为尺寸/分辨率不适合PDF文档。
据我了解,有几个选择:
似乎选项1可能是获得最佳分辨率/控制的首选方式 - 有些推测 - 这样做意味着您应该能够指定确切的位置和大小并获得正确的字体大小,线条粗细等..
使用选项2意味着您必须弄清楚UIView和PDF页面视图之间的缩放,我不确定它们如何相互映射。
任何人都可以就以下内容提出任何建议:
答案 0 :(得分:1)
好的,这就是我所做的
选项1:使用UIView.layer在PDF CGContect上呈现
func drawLineGraph(x: CGFloat, y: CGFloat)->CGRect{
let width = (pageSize.width - 2*kBorderInset - 2*kMarginInset)/2.0 - 50.0
let renderingRect = CGRect(x: x, y: y + 50.0, width: width, height: 150.0)
// Create a view for the Graph
let graphController = LineChartController(rect: renderingRect, building: self.building)
if let currentContext = UIGraphicsGetCurrentContext() {
let frame = graphController.chartView.frame
currentContext.saveGState()
currentContext.translateBy(x:frame.origin.x, y:frame.origin.y);
graphController.chartView.layer.render(in: currentContext)
currentContext.restoreGState()
}
return renderingRect
}
graphController
只是一个与包含图形的通常父ViewController
具有基本相同功能的对象。设置图形参数和数据。
完成后,将调用以下函数在PDF页面上下文中进行渲染。
将图表放在正确的位置需要一些翻译。
选项2:绘制PDF页面CGContect
解决方案是... ta da ...
func drawBarGraph(x: CGFloat, y: CGFloat)->CGRect{
let width = (pageSize.width - 2*kBorderInset - 2*kMarginInset)/2.0 - 50.0
let renderingRect = CGRect(x: x + width + 50, y: y + 50.0, width: width, height: 150.0)
// Create a view for the Graph
let graphController = BarChartController(rect: renderingRect, building: self.building)
if let currentContext = UIGraphicsGetCurrentContext() {
let frame = graphController.chartView.frame
currentContext.saveGState()
currentContext.translateBy(x:frame.origin.x, y:frame.origin.y)
//graphController.chartView.layer.render(in: currentContext)
graphController.chartView.draw(frame)
currentContext.restoreGState()
}
return renderingRect
}
由于当前上下文设置为PDF页面的上下文,因此只需调用图表draw()
函数直接传递框架矩形。
我在这里错过了什么,这可不容易?