SwiftUI - 在 macOS 上翻转全局坐标空间
Posted
技术标签:
【中文标题】SwiftUI - 在 macOS 上翻转全局坐标空间【英文标题】:SwiftUI - Global coordinate space is flipped on macOS 【发布时间】:2020-11-27 14:29:51 【问题描述】:编辑:
已确认是 Apple 错误。现在已在 macOS Monterey 上修复
在我看来,通过GeometryReader
阅读框架在 macOS 上被破坏了。
显然,当您在local
或named
坐标空间中读取帧时,返回的帧位于“SwiftUI 坐标空间”中,其中(0,0)
点位于左上角。
但是,当您在 global
空间中读取帧时,返回的帧位于“本机 macOS 空间”中,而 (0,0)
位于左下角。
这种行为是否记录在任何地方,还是一个错误? 我想弄清楚我是否在这里遗漏了什么。
我的示例代码:
struct ContentView: View
var body: some View
ZStack(alignment: .bottom)
Color.blue
.frame(width: 100, height: 150)
Color.red
.frame(width: 20, height: 60)
.background(
GeometryReader geo -> Color in
let g = geo.frame(in: .global)
let s = geo.frame(in: .named("stack"))
print("Global: \(g) | Stack: \(s)")
return Color.purple
)
.padding(.bottom, 5)
.coordinateSpace(name: "stack")
.padding(40)
.background(Color.pink)
输出:
全球:(80.0, 45.0, 20.0, 60.0) |堆栈:(40.0, 85.0, 20.0, 60.0)
【问题讨论】:
已知并记录在案。请参阅https://***.com/questions/21751105/mac-os-x-convert-between-nsview-coordinates-and-global-screen-coordinates 和来自Apple Developer Archives。 @Yrb 我知道 macOS 使用的坐标系与 ios 不同。当你使用纯可可时,这一切都说得通。我发现令人困惑的是 SwiftUI 以 both 方式返回帧。当询问“全局”框架时,它与“局部”框架位于不同的坐标系中。这尤其成问题,因为 SwiftUI 是一个多平台框架,因此它的行为在所有平台上应该或多或少相同。 @msmialko 同意。我希望“全局”引用一个窗口和其他一些屏幕坐标术语。或者让文档说您需要为 App 结构中的每个窗口设置一个命名坐标空间。 【参考方案1】:我明白了。我误读了你写的东西。我花了一些时间去这个兔子洞,并没有找到明确的答案。没有人在谈论局部坐标空间与全局坐标空间。作为对.frame
的测试,我修改了您的GeometryReader
如下:
GeometryReader geo -> Color in
let g = geo.frame(in: .global)
let gX = g.minX
let gY = g.minY
let s = geo.frame(in: .named("stack"))
print("Global: \(g), minX: \(gX), minY: \(gY) | Stack: \(s)")
输出结果是:
全局:(80.0, 45.0, 20.0, 60.0), minX: 80.0, minY: 45.0 |堆栈:(40.0, 85.0, 20.0, 60.0)
因此,虽然我无法回答您关于 Apple 的意图的问题,但显然全局坐标系已旋转,这不是 .frame
在全局空间中将 x 切换为 y 的错误。还有一些没有记录的东西。
【讨论】:
谢谢伙计。然后我会提交一个雷达,以便他们可以更改它或在文档中明确说明:) 请发布雷达#。希望这些文档在未来的某个时候能赶上…… 报FB9075217以上是关于SwiftUI - 在 macOS 上翻转全局坐标空间的主要内容,如果未能解决你的问题,请参考以下文章
SwiftUI 中如何获取任意视图触摸位置(全局或局部)的坐标
SwiftUI 中如何获取任意视图触摸位置(全局或局部)的坐标
SwiftUI 中如何获取任意视图触摸位置(全局或局部)的坐标
在 SwiftUI for macOS 应用程序中获取点击手势的鼠标/指针位置