Можно ли использовать диаграммы iOS (Дэниэл Гинди) для создания графиков в pdf-документе на iOS

Я использую iOS Charts (Daniel Gindi) для создания графиков в приложении iOS, и я хочу иметь возможность для создания отчета в формате PDF с этими графиками, включенными в основную часть отчета. Может ли кто-нибудь объяснить, как это сделать. В идеале я не хочу создавать изображение из UIView, которое отображается в приложении, потому что размер/разрешение не подходят для документа PDF.

Как я понимаю есть несколько вариантов:

  1. use the graphics context for the pdf document to draw the graph on - it's not clear whether this would be possible when using the Charts library
    1. use a UIView somehow to generate the graph and generate a PDF image data from that, embed this image into the pdf report

Похоже, что вариант 1, вероятно, является предпочтительным способом получения наилучшего разрешения/управления - несколько спекулятивным - такой способ означает, что вы должны иметь возможность указать точную позицию и размер и получить правильные размеры шрифта, толщину линий и т. д.

Использование варианта 2 означает, что вам нужно выяснить масштабирование между UIView и представлением страницы PDF, и я не уверен, как они будут сопоставляться друг с другом.

Может ли кто-нибудь дать какие-либо предложения по следующему:

  1. Можно ли использовать диаграммы для создания графиков в документе PDF, и если да, то как?
  2. Если нет, то какие еще есть варианты, если не считать написания пользовательского кода рисования.

person Duncan Groenewald    schedule 18.05.2018    source источник


Ответы (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

И решение... та да...

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() диаграмм, непосредственно передавая прямоугольник кадра.

Что я пропустил здесь, это может быть так просто?

Вы можете найти здесь копию сгенерированного файла PDF, а также пример кода.

person Duncan Groenewald    schedule 21.05.2018
comment
но как он будет связывать данные? Вы уверены, что он создает PDF-файл с данными на графике? - person CodeChanger; 21.05.2018
comment
Если бы я знал, как прикрепить pdf к моему ответу, я бы приложил вывод. Я прикреплю png с увеличенным изображением, чтобы вы могли сами увидеть. graphController предоставляет источник данных. Я также опубликую класс контроллера для полноты картины. - person Duncan Groenewald; 22.05.2018
comment
@CodeChanger - я обновил свой ответ ссылкой на сгенерированный файл PDF - вы можете проверить это сами. Я опубликую больше кода в какой-то момент. - person Duncan Groenewald; 22.05.2018