【发布时间】: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)
【问题讨论】:
-
@Yrb 我知道 macOS 使用的坐标系与 iOS 不同。当你使用纯可可时,这一切都说得通。我发现令人困惑的是 SwiftUI 以 both 方式返回帧。当询问“全局”框架时,它与“局部”框架位于不同的坐标系中。这尤其成问题,因为 SwiftUI 是一个多平台框架,因此它的行为在所有平台上应该或多或少相同。
-
@msmialko 同意。我希望“全局”引用一个窗口和其他一些屏幕坐标术语。或者让文档说您需要为 App 结构中的每个窗口设置一个命名坐标空间。