Cómo crear un CGPath desde un file, es decir, SVG

¿Es posible crear un CGPath de un file dado?

Se preferiría SVG, pero todo funcionará.

PocketSVG convertirá un file SVG en un UIBezierPath del que puede get un CGPath:

PocketSVG *myBezier = [[PocketSVG alloc] initFromSVGFileNamed:@"BezierCurve1-iPad"]; UIBezierPath *myPath = myBezier.bezier; //myPath.CGPath <--- your CGPath 

Parece que hay una solución más inteligente SVGKit :

SVGKit es un framework de Cocoa para renderizar files SVG como capas de Core Animation. Todas las forms están representadas por instancias de la class CAShapeLayer, y son, por layout, animables. SVGKit es compatible con los últimos Mac OS X y iOS SDK.

Luché con esta también, recorriendo la web para encontrar una solución. SVGKit parece ser la solución más cercana que pude encontrar, pero aún así no funcionó. El problema que tuve fue que parecía solo admitir ciertos files SVG y no tuve éxito en convertir cualquiera de mis files a un formatting compatible. Incluso escribí mi propio analizador, pero los resultados también fueron inconsistentes.

Empecé a examinar las especificaciones de SVG con mayor profundidad y parece haber algunas inconsistencias en la forma en que cada herramienta de edición de vectores generaba estos files. Luego terminé mirando el formatting FXG de Adobe, que se basa en SVG. Una cosa que noté de inmediato fue que los commands en los datos de la ruta eran absolutos y no relativos. Esto (en mi humilde opinión) de lejos hizo que FXG fuera superior a SVG.

Pude convertir esto en un CGPath que realmente funcionó perfecto. Mis necesidades actuales solo requieren la conversión de los datos de la Ruta para su uso como routes de recorte, pero es totalmente posible admitir la especificación FXG completa.

Aquí hay una pequeña aplicación de AIR que reuní para generar commands Core Graphics a partir de los datos de la ruta FXG, que demuestra el potencial. http://iksnae.com/fxgtool/

Espero que también te ayude.

[Actualización: en los años intermedios desde la primera vez que respondí esta pregunta, publiqué una class para manejar esto bajo la licencia MIT: SVGgh SVGPathGenerator . Buscar:

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

]

Estoy buscando hacer esto hoy, y todos los operandos, excepto los operandos de arco absoluto y relativo, se correlacionan muy bien con la API de creación de ruta de CGMutablePathRef. Estaba buscando en google encontrar el vudú matemático necesario para hacer que la definición SVG de un arco sea compatible con CGPathAddArcToPoint cuando me topé con esta pregunta. Solo tienes que analizar el atributo d del elemento de ruta SVG, que puedes get a través del object NSXMLParser y un delegado que proporciones.

Si puede utilizar el código de GPL, que no puedo, entonces el origen de Webkit tiene un file SVGPathParser.cpp que tiene algunos tidbits útiles. El W3C tiene algunas notas de implementación útiles, y Gabe Lerner lo implementó en JavaScript.

Sí. Es posible. No lo he hecho, pero como SVG utiliza routes en sí , parece que mapear una ruta SVG a un CGPath sería algo posible / manejable. La pregunta en ese momento se convierte en lo motivado que eres? No vi ninguna biblioteca Objective-C que ya lo haga en una búsqueda superficial de Google, pero puede estar ahí. Sí vi una implementación de Java , que probablemente podrías portar.

Teniendo en count la falta de soluciones obvias en la web, supongo que esta no es una necesidad muy común para los desarrolladores de aplicaciones. Probablemente haya una forma mejor / más fácil de resolver el problema. Si lo único que desea es mostrar una image SVG, puede simplemente insert una vista web y dejar que WebKit lo procese.