如何在 SwiftUI(不是 Cocoa)中设置 MacOS 应用程序容器窗口的宽高比

问题描述 投票:0回答:1

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 类并设置自己的窗口控制器。这提供了更多的控制,但我还没有看到这种类型的应用程序有任何类似的东西。

macos swiftui window aspect-ratio
1个回答
0
投票

您可以使用 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

© www.soinside.com 2019 - 2024. All rights reserved.