Заставить рисунок NSView вести себя так, как будто изображение на сетчатке
У меня есть собственный NSView, который рисует диаграмму в моем приложении. Я создаю PDF, который включает в себя изображение. В iOS я делаю это, используя такой код:
UIGraphicsBeginImageContextWithOptions(self.frame.size, NO, 0.0);
[self drawRect:self.frame];
UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
В iOS дисплеи имеют сетчатку, что означает, что изображение имеет очень высокое разрешение, однако я сейчас пытаюсь сделать это в своем приложении Mac, и качество изображения низкое, потому что компьютеры без сетчатки глаза будут генерировать не высокое разрешение версия изображения.
Я хотел бы заставить свой NSView вести себя так, как будто это была сетчатка, когда я использую его для генерации изображения. Таким образом, когда я помещу изображение в свой PDF, оно будет иметь гораздо более высокое разрешение. Сейчас это очень размыто и не привлекательно.
2 ответа
Ты можешь позвонить -[NSView dataWithPDFInsideRect:]
получить данные PDF из чертежа в виде. Например:
NSData* data = [someView dataWithPDFInsideRect:someView.bounds];
[data writeToFile:@"/tmp/foo.pdf" atomically:YES];
Любой векторный рисунок (например, текст, контуры Безье и т. Д.), Выполняемый вашим представлением и его подпредставлениями, будет отображаться в PDF как масштабируемая векторная графика.
Даже растровое изображение Retina будет достаточно размытым и непривлекательным при достаточном увеличении. Предполагая, что представление рисует свое содержимое в drawRect:
вместо того, чтобы пытаться визуализировать представление в PDF с фиксированным разрешением, лучшим подходом является рисование непосредственно в графическом контексте PDF. Это даст хороший масштабируемый PDF. Код чертежа должен быть учтен, чтобы его можно было использовать как для вида drawRect:
и PDF.
Кроме того, в документации iOS указано, что вы никогда не должны звонить drawRect:
сам. Вызов renderInContext:
на слое вида, или используйте более новый drawViewHierarchyInRect:afterScreenUpdates:
,