當我嘗試轉換路徑時,將其移動到{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)
擋板!我在這裏忽略了一些基本的東西嗎?
感謝您的反饋爲我工作。如果我用矩形創建路徑,它也適用於我。所以看起來,不知何故,路徑數據本身就會出現異常,並導致UIBezierPath/CGPath產生奇怪的結果。如果是這樣,奇怪的是,borked數據可能以這種方式搞垮了界限。乾杯。 – Womble