2010-08-23 80 views

回答

2

好像有一个更聪明的解决方案SVGKit

SVGKit是可可框架用于渲染SVG文件作为核心动画层。所有形状都由CAShapeLayer类的实例来表示,并且通过设计可以生成动画。 SVGKit与最新的Mac OS X和iOS SDK兼容。

+0

这很好,但它目前不支持浮点。有一个使用NSScanner的拉取请求。这确实在路径上进行浮点运算。 – slf 2011-09-16 12:56:47

1

是的。有可能的。我没有这样做,但因为SVG uses paths itself,似乎将SVG路径映射到CGPath将是可能的/可管理的。那个时候的问题变成了你的动力?我没有看到任何已经在粗略的谷歌搜索中做到这一点的Objective-C库,但它可能在那里。我确实看到a Java implementation,你可能会移植。

考虑到在网络上缺乏明显的解决方案,我想这不是app应用程序开发者非常普遍的需求。可能有更好/更简单的方法来解决手头的问题。如果你只想显示一个SVG图像,你可以嵌入一个webview并让WebKit为你呈现。

+0

我不想只是显示SVG。在某些视图中,我需要相当复杂的路径。因为我希望用户能够改变这条道路,如果他们能够在他们最喜欢的矢量程序中绘制它们,那将是很好的。 – vikingosegundo 2010-08-23 16:49:44

+0

这很有道理。不幸的是,它看起来好像没有任何Objective-C实现。我见过一些C++库,但它们看起来非常庞大,并且很难移植。支持完整的SVG规范可能是可行的,但耗时。祝你好运。 – 2010-08-23 17:51:45

2

[更新:在我第一次回答这个问题的间隔时间里,我发布了一个课程来处理MIT许可证下的这个问题:SVGgh SVGPathGenerator。寻找:

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

]

我期待在今天这个做的,除了绝对和相对弧操作数的所有操作数非常整齐地映射到CGMutablePathRef的路径创建API。当我遇到这个问题时,我正在使用Google搜索来找到使弧的SVG定义与CGPathAddArcToPoint兼容所需的数学巫术。您只需解析SVG路径元素的d属性,您可以通过NSXMLParser对象和您提供的委托来获取该属性。

如果您可以使用GPL'd代码,那么Webkit源代码有一个SVGPathParser.cpp文件,它具有一些有用的花絮。 W3C有一些有用的implementation notesGabe Lerner在JavaScript中实现它。

2

我也在为这个问题苦苦挣扎,寻求解决方案。 SVGKit似乎是我能找到的最接近的解决方案,但仍然没有完成这项工作。我遇到的问题是,它似乎只支持某些SVG文件,我没有成功将我的任何文件转换为兼容格式。我甚至写了自己的解析器,但结果也不一致。

我开始深入研究SVG规范,每个向量编辑工具如何生成这些文件似乎存在一些不一致之处。然后,我最终研究了基于SVG的Adobe FXG格式。我立即注意到的一件事是Path数据中的命令都是绝对的而不是相对的。这(恕我直言)远远使FXG优于SVG。

我能够将其转换为实际工作完美的CGPath。我目前的需求只需要转换路径数据作为剪辑路径,但完全可以支持完整的FXG规范。

这里有一个AIR应用程序,我将它放在一起用于从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