代码之家  ›  专栏  ›  技术社区  ›  vikingosegundo

如何从文件(即svg)创建cgpath

  •  2
  • vikingosegundo  · 技术社区  · 14 年前

    是否可以从给定的文件创建cgpath?

    SVG是首选,但任何东西都可以。

    5 回复  |  直到 9 年前
        1
  •  5
  •   Eric    12 年前

    PocketSVG 将SVG文件转换为uibezierPath,从中可以获取cgpath:

    PocketSVG *myBezier = [[PocketSVG alloc] initFromSVGFileNamed:@"BezierCurve1-iPad"];    
    UIBezierPath *myPath = myBezier.bezier;
    //myPath.CGPath <--- your CGPath
    
        2
  •  2
  •   vikingosegundo    14 年前

    似乎有一个更聪明的解决方案 SVGKit :

    svgkit是一个cocoa框架,用于将svg文件渲染为核心动画层。所有形状都由cashapelayer类的实例表示,并且通过设计可以设置动画。SVGKIT与最新的Mac OS X和iOS SDK兼容。

        3
  •  2
  •   iksnae    13 年前

    我也在和这个做斗争,搜索网页寻找解决方案。Svgkit似乎是我能找到的最接近的解决方案,但仍然没有完成任务。我遇到的问题是,它似乎只支持某些SVG文件,我没有成功地将我的任何文件转换成兼容的格式。我甚至编写了自己的解析器,但结果也不一致。

    我开始更深入地研究SVG规范,似乎在每个向量编辑工具生成这些文件的方式上都存在一些不一致之处。最后我研究了Adobe的FXG格式,它基于SVG。我立刻注意到的一件事是,路径数据中的命令都是绝对的,而不是相对的。这(imho)到目前为止使fxg优于svg。

    我可以把它转换成一个实际工作完美的CGPath。我目前只需要将路径数据转换为剪切路径,但完全可以支持完整的fxg规范。

    下面是我拼凑的一个小Air应用程序,用于从fxg路径数据生成核心图形命令,展示了它的潜力。 http://iksnae.com/fxgtool/

    希望它也能帮助你。

        4
  •  2
  •   Glenn Howes    9 年前

    [更新:从我第一次回答这个问题的那几年里,我发布了一个类来处理这个问题,获得了麻省理工学院的许可证:svggh SVGPathGenerator . 寻找:

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

    ]

    我今天要做的是,除绝对和相对弧操作数以外的所有操作数都非常整齐地映射到cgmutablepathref的路径创建API。当我遇到这个问题的时候,我在谷歌上找到了使弧的SVG定义与cgpathaddarctopoint兼容所需的数学巫术。您只需解析svg path元素的d属性,您可以通过nsxmlparser对象和提供的委托来获得它。

    如果您可以使用gpl'd代码(我不能使用),那么webkit源代码有一个文件svgpathparser.cpp,其中包含一些有用的信息位。W3C有一些有用的 implementation notes Gabe Lerner 它是用JavaScript实现的。

        5
  •  1
  •   Matt Long    14 年前

    对。这是可能的。我没做过,但因为 SVG uses paths itself ,似乎将SVG路径映射到CGPath是可能的/可管理的。此时的问题是你有多积极?我没有看到任何Objective-C库已经在粗略的谷歌搜索中完成了这项工作,但它可能已经出现了。我确实看到了 a Java implementation ,你可以移植。

    考虑到网络上缺乏明显的解决方案,我想这不是应用程序开发人员的常见需求。可能有更好/更容易的方法来解决手头的问题。如果您只想显示一个SVG图像,您可以嵌入一个WebView,让WebKit为您呈现它。