Как создать CGPath из файла - т.е. SVG - PullRequest
2 голосов
/ 23 августа 2010

Можно ли создать CGPath из данного файла?

SVG предпочтительнее, но все будет работать.

Ответы [ 5 ]

5 голосов
/ 02 августа 2012

PocketSVG превратит файл SVG в UIBezierPath, из которого вы можете получить CGPath:

PocketSVG *myBezier = [[PocketSVG alloc] initFromSVGFileNamed:@"BezierCurve1-iPad"];    
UIBezierPath *myPath = myBezier.bezier;
//myPath.CGPath <--- your CGPath
2 голосов
/ 30 сентября 2011

Я тоже боролся с этим, пытаясь найти решение в сети.SVGKit кажется самым близким решением, которое я мог найти, но все же не справился с работой.Проблема, с которой я столкнулся, заключалась в том, что она, казалось, поддерживала только определенные файлы SVG, и мне не удалось преобразовать любой из моих файлов в совместимый формат.Я даже написал свой собственный синтаксический анализатор, но результаты также были противоречивы.

Я начал изучать спецификации SVG более глубоко, и, похоже, есть некоторые несоответствия в том, как каждый инструмент векторного редактирования генерировал эти файлы.Затем я остановился на формате Adobe FXG, который основан на SVG.Одна вещь, которую я сразу заметил, заключалась в том, что команды в данных Path были абсолютными и не относительными.Это (IMHO) безусловно сделало FXG превосходящим SVG.

Я смог преобразовать это в CGPath, который действительно работал идеально.Мои текущие потребности требовали только преобразования данных Path для использования в качестве обтравочных контуров, но вполне возможно поддерживать полную спецификацию FXG.

Вот небольшое приложение AIR, которое я создал вместе для генерации команд Core Graphics из данных пути FXG, которое демонстрирует потенциал.http://iksnae.com/fxgtool/

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

2 голосов
/ 14 января 2011

[Обновление: за прошедшие годы, когда я впервые ответил на этот вопрос, я выпустил класс для обработки этого по лицензии MIT: SVGgh SVGPathGenerator . Ищите:

+(CGPathRef) newCGPathFromSVGPath:(NSString*)anSVGPath whileApplyingTransform:(CGAffineTransform)aTransform

]

Я смотрю на это сегодня, и все операнды, за исключением абсолютных и относительных операндов дуги, очень аккуратно отображаются в API создания пути CGMutablePathRef. Я гуглил, чтобы найти математическое вуду, необходимое для того, чтобы SVG-определение дуги было совместимо с CGPathAddArcToPoint, когда я натолкнулся на этот вопрос. Вам просто нужно проанализировать атрибут d элемента пути SVG, который вы можете получить через объект NSXMLParser и предоставленный вами делегат.

Если вы можете использовать код под GPL, чего я не могу, то в исходном коде Webkit есть файл SVGPathParser.cpp, в котором есть несколько полезных деталей. В W3C есть несколько полезных замечаний по реализации , а Гейб Лернер реализовал его в JavaScript.

2 голосов
/ 26 июня 2011

Похоже, есть более умное решение SVGKit :

SVGKit - это инфраструктура Какао для рендеринга файлов SVG как слоев Core Animation. Все фигуры представлены экземплярами класса CAShapeLayer и по дизайну являются анимируемыми. SVGKit совместим с последними версиями Mac OS X и iOS SDK.

1 голос
/ 23 августа 2010

Да. Это возможно. Я этого не делал, но поскольку SVG сам использует пути , кажется, что сопоставление пути SVG с CGPath было бы чем-то возможным / управляемым. В этот момент возникает вопрос: насколько вы мотивированы? Я не видел библиотек Objective-C, которые уже делают это в кратком поиске Google, но это может быть там. Я видел реализацию Java , которую вы, вероятно, могли бы портировать.

Учитывая отсутствие очевидных решений в сети, я думаю, это не очень распространенная потребность в разработчиках приложений. Вероятно, есть лучший / более простой способ решения проблемы. Если все, что вам нужно, это отобразить изображение в формате SVG, вы можете просто встроить веб-представление и позволить WebKit его отобразить.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...