19

我正在尝试将矢量绘图程序中的路径导入 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)路径)。

4

7 回答 7

13

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

http://www.paintcodeapp.com/

于 2013-06-17T15:54:52.593 回答
3

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

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

(自今年年初以来,我一直在 iOS 项目中使用它,效果很好)

2018 年更新:现在支持 OSX,并且 SVGKit 可以快速准确地渲染大多数 SVG。不利的一面是,并非全部支持高级文本功能(例如,渐变填充是,但复杂文本布局不支持)。

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

于 2012-05-09T13:52:51.627 回答
2

如果你愿意做一些从 JS 到 ObjC 的翻译,那么你可能会发现这个项目很有帮助:

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

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

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

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

HTH 凯文

于 2011-07-18T21:11:23.697 回答
2

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

从 PaintCode 回到 Sketch 保存为 PDF 并导入 ok

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

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

于 2014-04-15T11:33:11.053 回答
0

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

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

您可以使用它来完全按照您的要求进行操作。

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

于 2015-04-07T13:48:07.473 回答
0

将 SVG 添加到 NSView 的 Oneliner:

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

用于 Swift 的 SVGLib:https ://github.com/eonist/swift-utils

于 2016-05-05T07:47:06.020 回答
0

此解决方案是将 SVG 路径字符串直接转换为 UIBezierPath。它非常适合我的应用程序,我必须将美国绘制为 UIView。

https://github.com/ap4y/UIBezierPath-SVG

于 2017-03-17T00:04:50.567 回答