Iphone 如何将SVG导入/解析到UIBezierPath、NSBezierPath、CGPath中?

Iphone 如何将SVG导入/解析到UIBezierPath、NSBezierPath、CGPath中?,iphone,svg,cgpath,nsbezierpath,Iphone,Svg,Cgpath,Nsbezierpath,我正在尝试将路径从矢量绘图程序导入ios环境。我想让他们进入cgpath或uibezierpath。我最感兴趣的是从adobe illustrator导入路径。最好的方法似乎是保存为svg,然后导入 我找到了一些用于解析描述路径的导出SVG文件的资源。然而,我发现的一切只涉及绝对路径,而不是相对路径。下面的路径有大写C和小写C。我知道如何解析大写字母C(绝对路径),但不知道如何解析小写字母C(相对路径) 我正在寻找有关编写用于将svg文件导入ios/cocoa的解析器的帮助。我认为,通过在互联网

我正在尝试将路径从矢量绘图程序导入ios环境。我想让他们进入cgpath或uibezierpath。我最感兴趣的是从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

如果这都是绝对路径,我现在就能解决这个问题了。真正让我困惑的是相对路径(即Lowcase(c)路径)。

如果您愿意将JS转换为ObjC,那么您可能会发现该项目很有帮助:

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

我应该提到,我在几年前写过这段代码,但我已经将其翻译成Java和C语言,并在专业产品中使用过(不幸的是,无法共享该代码),而且它似乎在这些环境中也能很好地工作


Kevin

ObjectiveC中有一个开源SVG库,专门用于iOS(和OS X,尽管OS X构建有点落后):

(从今年年初开始,我就在iOS项目上使用它,效果很好)

2018更新:OSX支持现已启用,SVGKit可以准确呈现大多数SVG的fast+。另一方面,高级文本功能并非全部受支持(例如,渐变填充为“是”,复杂文本布局为“否”)


截至2012年初,它还不是SVG规范的100%实现,但是有很多人正在努力实现它。

好吧,伙计们,如果你愿意为此付费的话。此工具将解决您的所有问题。您可以导入svg或psd,并为您生成代码。我用过它,它太棒了


Mac App Store上的Sketch 3擅长编辑(可能比PaintCode更好),然后作为SVG导出到PaintCode

从PaintCode返回草图另存为PDF并导入ok

确保将两者中的画布大小设置为相同,否则需要缩放上下文。

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

+(CGPathRef) newCGPathFromSVGPath:(NSString*)anSVGPath whileApplyingTransform:(CGAffineTransform)aTransform;
您可以使用它来完全满足您的要求


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

一个将SVG添加到NSView的行程序:

addSubView(SVGParser.svg(FileParser.xml(~/Desktop/test.svg)))

svglibforswift:

此解决方案是将SVG路径字符串直接转换为UIBezierPath。它对我的应用程序非常有用,我必须把美国画成一个UIView


PaintCode不支持GradientStroke。希望他们将来能加上这个。