パスを変換しようとすると、そのパスを{0、0}の原点に移動すると、パスの境界にエラーが発生します。 (または、私の前提が間違っている)。UIBezierPath変換変換が間違った答えを返します
パスは、次の境界情報を与える:
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
は変換状態を保持していないようです。変換が呼び出されると直ちに点が変換されます。
ありがとうございました。
背景:
経路データはPocketSVG
介して、Font-Awesome
SVGsからです。すべてのファイルが解析され、ほとんどがOKです。しかし、小さなサブセットは、上記の翻訳の問題を示しています。私は、SVGの解析、欠陥を探しているパス構築コードを調べる前に、私が根本的に間違っていることや愚かなことをしているかどうかを知りたいです。
私はこの段階で描いたり、文脈を扱ったりしていません。私は描画する前にパスを構築しています。
[編集]
PocketSVGは私に適切に形成されたデータを与えていたことを確認するために、私はSwiftSVGに同じSVGを通過し、そして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)
バッフリング!ここで本当に基本的なものを見落としていますか?
フィードバックをありがとう。私がrectを使ってパスを作成すると、私のために働いています。それで、どういうわけか、パスデータそのものがボルケージされ、UIBezierPath/CGPathが奇妙な結果を引き起こしているようです。もしそうなら、骨抜きにされたデータがこのように境界線を狂わせてしまうのは不思議です。乾杯。 – Womble