2017-06-05 55 views
-1

當我嘗試轉換路徑時,將其移動到{0,0}的原點,結果路徑邊界出錯。 (或者,我的假設是錯誤的)。UIBezier路徑轉換提供了錯誤的答案

例如路徑提供了以下界限信息:

let bezier = UIBezierPath(cgPath: svgPath) 
print(bezier.bounds) 

// (0.0085, 0.7200, 68.5542, 41.1379) 

print(bezier.cgPath.boundingBoxOfPath) 

// (0.0085, 0.7200, 68.5542, 41.1379) 

print(bezier.cgPath.boundingBox) 

// (-1.25, -0.1070, 70.0360, 41.9650) 

我(嘗試)的路徑移動到原點:

let origin = bezier.bounds.origin 
bezier.apply(CGAffineTransform(translationX: -origin.x, y: -origin.y)) 

print(bezier.bounds) 

// (0.0, -2.7755, 68.5542, 41.1379) 

正如你所看到的,x origin成分是正確的0。但,在y component(-2.7755)已經全部kittywumpus。它應該是0,不是?

當我對cgPath屬性執行轉換時,會發生同樣的情況。

有誰知道什麼樣的情況可能會導致UIBezierPath/CGPath翻譯成這樣?在閱讀Apple文檔後,似乎UIBezierPath/CGPath不保持轉換狀態;當變換被調用時,點將立即轉換。

感謝您的任何幫助。

背景:

的路徑數據是從Font-Awesome SVGs,經由PocketSVG。所有的文件都解析,並且大部分都是確定的。但是一小部分展示了上述翻譯問題。我想知道,在我通過SVG解析,路徑構建代碼尋找缺陷之前,我是否正在做一些根本性錯誤或愚蠢的事情。

順便說一句我不是在這個階段繪畫或以其他方式處理上下文;我正在繪製之前建立路徑。

[編輯]

要檢查PocketSVG是給我適當地形成的數據,我通過相同的SVG到SwiftSVG,並得到了相同的路徑數據PocketSVG,和相同的結果:

let svgURL = Bundle.main.url(forResource: "fa-mars-stroke-h", withExtension: "svg")! 
var bezier = UIBezierPath.pathWithSVGURL(svgURL)! 
print(bezier.bounds) 

// (0.0085, 0.7200, 68.5542, 41.1379) 

let origin = bezier.bounds.origin 
let translation = CGAffineTransform(translationX: -origin.x, y: -origin.y) 
bezier.apply(translation) 
print(bezier.bounds) 

// (0.0, -2.7755, 68.5542, 41.1379) 

再次說明,y分量應該是0,但不是。很奇怪。

一時興起,我想我會嘗試再次應用轉換。而且,它的工作!

let translation2 = CGAffineTransform(translationX: -bezier.bounds.origin.x, y: -bezier.bounds.origin.y) 
bezier.apply(translation2) 
print(bezier.bounds) 

// (0.0, 0.0, 68.5542491336633, 41.1379438254997) 

擋板!我在這裏忽略了一些基本的東西嗎?

回答

0

我已經試過一樣的,你和XCode中8.3.2/iOS的10

enter image description here

+1

感謝您的反饋爲我工作。如果我用矩形創建路徑,它也適用於我。所以看起來,不知何故,路徑數據本身就會出現異常,並導致UIBezierPath/CGPath產生奇怪的結果。如果是這樣,奇怪的是,borked數據可能以這種方式搞垮了界限。乾杯。 – Womble