SwiftUI - 在 macOS 上翻转全局坐标空间

Posted

技术标签:

【中文标题】SwiftUI - 在 macOS 上翻转全局坐标空间【英文标题】:SwiftUI - Global coordinate space is flipped on macOS 【发布时间】:2020-11-27 14:29:51 【问题描述】:

编辑:

已确认是 Apple 错误。现在已在 macOS Monterey 上修复


在我看来,通过GeometryReader 阅读框架在 macOS 上被破坏了。

显然,当您在localnamed 坐标空间中读取帧时,返回的帧位于“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 应用程序中获取点击手势的鼠标/指针位置

在 MacOS 上构建 SwiftUI “Hello World”

SwiftUI - 如何在 macOS 上隐藏窗口标题