XCode 14.3.1。运行 Ventura 13.4.1 的 Mac。 我有一个时钟应用程序,其中视图的宽高比被限制为 1 比 1。 然而,包含窗口可以调整大小,但没有宽高比限制。 视图保持正确的比例,但如果窗户很高而且看起来很糟糕 薄,视野小。这是一个单窗口应用程序,因此使用 WindowGroup 而不是 NSWindow。
在入口点代码中,我可以像这样设置窗口最大和最小尺寸
import SwiftUI
@main
struct Mac_TestApp: App {
var body: some Scene {
WindowGroup {
Overall_View()
.frame(minWidth: 300, idealWidth: 500, maxWidth: 600, minHeight: 300, idealHeight: 500, maxHeight: 600)
}
.windowResizability(.contentSize)
}
}
这设置了窗口宽度和高度可以调整大小的最大和最小尺寸,但不固定宽高比。 我可以为 WindowGroup 更改的参数列表非常短,并且没有我可以看到的任何纵横比(此类应用程序中没有 AppDelegate)。我见过文档应用程序的示例,您可以在其中重写 NSWindow 类并设置自己的窗口控制器。这提供了更多的控制,但我还没有看到这种类型的应用程序有任何类似的东西。
您可以使用 Asperi 的
WindowAccessor
来实现此目的。 这个答案中描述了该方法。它使用 NSViewRepresentable
来访问底层 NSWindow
。
struct WindowAccessor: NSViewRepresentable {
@Binding var window: NSWindow?
func makeNSView(context: Context) -> NSView {
let view = NSView()
DispatchQueue.main.async {
self.window = view.window // << right after inserted in window
}
return view
}
func updateNSView(_ nsView: NSView, context: Context) {}
}
因此,根据您的情况,您可以执行以下操作:
struct Mac_TestApp: App {
@State private var window: NSWindow?
var body: some Scene {
WindowGroup {
Overall_View()
.frame(minWidth: 300, idealWidth: 500, maxWidth: 600, minHeight: 300, idealHeight: 500, maxHeight: 600)
.background(WindowAccessor(window: $window))
.onChange(of: window) { newWindow in
newWindow?.contentAspectRatio = desiredAspectRatio
}
.windowResizability(.contentSize)
}
}
}
另一方面,对于单窗口应用程序和开发目标 macOS 13+,请使用
Window
场景而不是 WindowGroup
。