Печать диаграммы шиноби в PDF

В моем приложении есть несколько шинобихартов, которые я хочу распечатать в PDF-файл. Все остальное, как и обычные виды, метки и изображения работают нормально, даже отображаются сетка, легенда и метки сетки. Не хватает только серии. Таким образом, в основном я получаю пустую диаграмму, напечатанную в файле PDF.

Я печатаю PDF следующим образом:

NSMutableData * pdfData=[NSMutableData data];
PDFPage1ViewController *pdf1 = [self.storyboard instantiateViewControllerWithIdentifier:@"PDF1"];
pdf1.array1 = array1;
pdf1.array2 = array2;
pdf1.array3 = array3;
pdf1.array4 = array4;
UIGraphicsBeginPDFContextToData(pdfData, CGRectZero,nil);
CGContextRef pdfContext=UIGraphicsGetCurrentContext();
UIGraphicsBeginPDFPage();
[pdf1.view.layer renderInContext:pdfContext];
UIGraphicsEndPDFContext();

Точно такой же код из PDF1PageViewController рисует красивые графики в обычном viewController, не пропуская серии. Массивы содержат данные, которые должны отображаться.

[РЕДАКТИРОВАТЬ]

Этот код сделал это для меня:

UIGraphicsBeginImageContextWithOptions(pdf1.view.bounds.size, NO, 0.0);
[pdf1.view drawViewHierarchyInRect:pdf1.view.bounds afterScreenUpdates:YES];
UIImage *pdf1Image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
UIImageView *pdf1ImageView = [[UIImageView alloc] initWithImage:pdf1Image];
[pdf1ImageView.layer renderInContext:pdfContext];

Хотя колесо активности перестает вращаться после drawViewHierarchyInRect и метка, отображающая текущую отображаемую страницу, также перестает обновляться. Кто-нибудь знает, как это исправить?

1 ответ

Решение

Причина, по которой вы столкнулись с этой проблемой, заключается в том, что часть последовательностей диаграмм отображается в openGLES и, следовательно, не отображается как часть renderInContext:,

У вас есть несколько вариантов, которые вы можете исследовать, используя. во-первых, это добавление некоторых методов UIView в iOS7. Если ваше приложение может быть ограничено только iOS7, то snapshotViewAfterScreenUpdates: вернет вам UIView который является снимком содержимого. Я думаю, что следующий (непроверенный) код будет работать:

UIGraphicsBeginPDFPage();
UIView *pdfPage = [pd1.view snapshotViewAfterScreenUpdates:YES];
[pdfPage.layer renderInContext:pdfContext];
UIGraphicsEndPDFContext();

Более подробную информацию об этом подходе можно найти в блоге ShinobiControls по адресу http://www.shinobicontrols.com/blog/posts/2014/02/24/taking-a-chart-snapshot-in-ios7

Если ограничение вашего приложения на iOS7 не вариант, вы все равно можете достичь желаемого результата, но это немного сложнее. К счастью, в блоге ShinobiControls ( http://www.shinobicontrols.com/blog/posts/2012/03/26/taking-a-shinobichart-screenshot-from-your-app) есть пост в блоге, в котором описано как создать UIImage из графика. Это может быть легко адаптировано для рендеринга в контекст PDF, а не в контекст изображения, созданного в посте. Существует дополнительный фрагмент кода, сопровождающий сообщение, доступный на github: https://github.com/ShinobiControls/charts-snippets/tree/master/iOS/objective-c/screenshot.

Надеюсь это поможет

Сэм

Другие вопросы по тегам