2010-08-23 2 views

ответ

2

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

SVGKit является основой какао для отображения файлов в качестве основной анимации слоев. Все формы представлены экземплярами класса CAShapeLayer и по дизайну являются анимированными. SVGKit совместим с последними версиями Mac OS X и iOS SDK.

+0

Это хорошо, но в настоящее время он не поддерживает плавающие точки. Существует запрос на перенос, в котором используется NSScanner. Это делает плавающие точки на дорожках. – slf

1

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

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

+0

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

+0

Это имеет смысл. К сожалению, похоже, что никаких реализаций Objective-C не существует. Я видел некоторые библиотеки на C++, но они кажутся довольно массивными, и их будет сложно переносить. Поддержка полной спецификации SVG, вероятно, возможна, но требует много времени. Удачи. –

2

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

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

]

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

Если вы можете использовать код GPL'd, которого я не могу, то источник Webkit имеет файл SVGPathParser.cpp, который имеет некоторые полезные лакомые кусочки. W3C имеет некоторые полезные implementation notes, а Gabe Lerner реализовал его в JavaScript.

2

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

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

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

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

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

5

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

PocketSVG *myBezier = [[PocketSVG alloc] initFromSVGFileNamed:@"BezierCurve1-iPad"];  
UIBezierPath *myPath = myBezier.bezier; 
//myPath.CGPath <--- your CGPath 
Смежные вопросы