我正在慢慢地自学一些 macOS GUI 编程。
我认为坐标系的原点像大多数系统一样位于左上角,但遇到了这个旧的 OS X 文档:
局部坐标系 Cocoa 使用笛卡尔坐标系作为指定坐标的基本模型。该系统中的原点位于当前绘图空间的左下角,正值沿着原点向上和右侧的轴延伸。整个系统的根原点位于包含菜单栏的屏幕的左下角。
这似乎与我非常有限的 Mac 编程经验不符,所以我摸索了一些 SwiftUI 代码来测试它:
Path { path in
path.move(to: .zero)
path.addLine(to:CGPoint(x: 0, y: 20))
path.addLine(to:CGPoint(x: 25, y: 25))
path.addLine(to:CGPoint(x: 20, y: 0))
path.addLine(to: .zero)
path.closeSubpath()
}
这应该画一个正方形,其一个角在 X 和 Y 增加的方向上更尖。它产生了这个形状:
这清楚地表明它正在向下和向右移动,这与旧文档相矛盾。
所以我尝试用谷歌搜索 macOS 生态系统中哪些地方使用了旧坐标系,哪些地方使用了新坐标系,但无济于事。
显然,为了向后兼容,他们不能只是在某个时候翻转它。
只有 SwiftUI 在 macOS 中有所不同吗?为了与 iOS 保持一致,我相信 iOS 也使用左上角作为原点?
还是
AppKit
与其他一切相比?或者低级 CoreGraphics
的做法与在 NSView
上运行的高级内容不同吗?
理想情况下,我会敲出一些代码来测试它,但我还很不流畅,除了列出的那些之外,macOS 上可能还有其他区域。我认为这实际上是 Mac 程序员的常识,尽管谷歌搜索起来很难。
正如您所怀疑的,AppKit 有一个左下起源,更好地匹配常见的数学约定。 Mac 上的 Core Graphics 也有一个左下起源。核心文本在所有平台上也有一个左下原点。
UIKit(主要是 iOS)有一个左上角约定。这更好地匹配常见的 2D 计算机图形约定,但不匹配常见的 3D 计算机图形约定。不存在“明显”的约定。只有选择。
在平台之间移植时,这一直是一个麻烦。您可以应用各种属性和众所周知的变换来翻转系统。
Path
是 SwiftUI 的一部分。 SwiftUI 的一个关键目标是跨 Apple 平台移植,并且它普遍采用 iOS 左上角约定。您正在阅读的文档仍然准确,但不适用于 SwiftUI。