gpt4 book ai didi

ios - UIBezierPath 平移变换给出了错误的答案

转载 作者:行者123 更新时间:2023-11-30 12:24:27 27 4
gpt4 key购买 nike

当我尝试平移路径,将其移动到原点 {0, 0} 时,生成的路径边界错误。 (或者,我的假设是错误的)。

例如该路径给出以下边界信息:

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 分量 (-2.7755) 已经完全消失了。应该是0,不是?

当我对 cgPath 属性执行转换时,也会发生同样的情况。

有谁知道什么样的情况会导致 UIBezierPath/CGPath 在翻译时表现出这样的行为?阅读 Apple 文档后,似乎 UIBezierPath/CGPath 不保存转换状态;当调用变换时,点会立即变换。

感谢您的帮助。

背景:

路径数据来自 Font-Awesome SVG,通过 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)

令人困惑!我在这里忽略了一些非常基本的东西吗?

最佳答案

我已经尝试了与你相同的方法,并且正在 Xcode 8.3.2/iOS 10 中为我工作

enter image description here

关于ios - UIBezierPath 平移变换给出了错误的答案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44366589/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com