Можно ли использовать iOS Charts (Daniel Gindi) для генерации графиков в pdf документе на iOS - PullRequest
0 голосов
/ 19 мая 2018

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

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

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

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

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

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

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

1 Ответ

0 голосов
/ 21 мая 2018

ОК, вот что я сделал

Вариант 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

И решениеis ... 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, просто вызовите функцию charts draw(), непосредственно передавая прямоугольник рамки.

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

Здесь вы можете найти копию сгенерированного PDF и пример кода .

...