2010-08-23 97 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