如何将SVG导入/解析为UIBezierpaths、NSBezierpaths、CGPaths?

21

我正在尝试将从矢量绘图程序中获取的路径导入到IOS环境中。我希望将它们转换为CGpaths或UIbezierpaths格式。最感兴趣的是从Adobe Illustrator中导入路径。最好的方法似乎是将其保存为SVG格式,然后再进行导入。

我已经找到了一些解析导出的SVG文件来描述路径的资源。但是,我发现所有这些资源都只涉及绝对路径而不是相对路径。下面的路径包含大写字母C和小写字母c。我知道如何解析大写字母C(绝对路径),但我不知道如何解析小写字母c(相对路径)。

我正在寻求帮助编写用于将SVG文件导入IOS / Cocoa的解析器。通过搜索互联网几周,我认为这方面的需求非常大。

以下是一个我想要导入到我的iPhone应用程序中的路径示例。我不想导入图片,而是要导入路径本身,以便我可以对其进行操作。任何帮助将不胜感激。

x="0px" y="0px" width="320px" height="436px" viewBox="-1.4 -0.5 320 436"

 d="M294.1,116C290.6,1.4,170.9,0.4,159.6,0.5
C148.3,0.4,28.7,1.4,25.2,116c-3.7,120.3-49.6,141.4-5.9,233.9c41.3,87.4,130.7,87,140.4,86.7c9.7,0.3,99.1,0.8,140.4-86.7
C343.7,257.4,297.8,236.3,294.1,116z

如果这些都是绝对路径,我现在就能解决它了。相对路径(即小写(c)路径)让我真的很困惑。

7个回答

12

大家好,如果你愿意为此付费,这款工具将解决您所有的问题。您可以导入svg或psd文件,它会为您生成代码。我已经使用过它了,效果非常惊人!

http://www.paintcodeapp.com/


PaintCode不支持GradientStroke。希望他们将来会添加此功能。 - Sentry.co

3

有一个开源的SVG库,专门用于iOS(虽然OS X的版本有点落后):

https://github.com/SVGKit/SVGKit/

我从今年年初开始在iOS项目中使用它,效果很好。

2018更新:现在支持OSX,并且SVGKit可以快速+准确地呈现大多数SVG。不足之处是并不支持所有高级文本功能(例如支持渐变填充,但不支持复杂的文本布局)。

截至2012年初,它并非SVG规范的100%实现,但有很多人正在努力使其达到这一目标。


2
如果你愿意从JS翻译成ObjC,那么你可能会发现这个项目很有帮助:

https://github.com/thelonious/svg-2d

特别是,path.js文件包含一个parseData方法,处理相对路径和绝对路径命令。

https://github.com/thelonious/svg-2d/blob/master/shapes/path/Path.js

我应该提到,这段代码是几年前写的,但我已经将其翻译成了Java和C#,并在专业产品中使用过(不幸的是无法分享那些代码),在那些环境中它似乎也很好用。
希望能帮到你 Kevin

2
Mac App Store上的Sketch 3很擅长编辑(可能比PaintCode更好),然后将其导出为SVG到PaintCode。
要从PaintCode返回Sketch,请保存为PDF,然后可以导入。

https://itunes.apple.com/gb/app/sketch-3/id852320343?mt=12

确保两个画布的大小设置相同,并且在您的视图边界内,否则您需要缩放上下文。

0

SVGgh 包含一个类 SVGPathGenerator,它可以将 SVG 路径转换为 CGPathRef:

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

您可以使用它来精确地执行您的请求。

[Swift 3 更新] 如果您想要一个纯 Swift 解决方案。我的(正在进行中的)Scalar2D 库在 CGPath 上有一个扩展,可以从 SVG 路径创建 CGPath。


0

-1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接