基于文档的 MacOs 应用程序的 SwiftUI 窗口大小

Posted

技术标签:

【中文标题】基于文档的 MacOs 应用程序的 SwiftUI 窗口大小【英文标题】:SwiftUI window size for document based MacOs App 【发布时间】:2020-07-29 11:59:33 【问题描述】:

我正在将我的应用程序从 SwiftUI xCode 11 移动到 xCode 12 中新的基于文档的应用程序生命周期格式。我无法弄清楚如何设置窗口大小。在 Xcode 11 中我有

window = NSWindow(
            contentRect: NSRect(x: 0, y: 0, width: 1200, height: 800),
            styleMask: [.titled, .closable, .miniaturizable, .resizable, .fullSizeContentView],
            backing: .buffered, defer: false)

如何在没有 AppDelegate 的情况下达到同样的效果?

【问题讨论】:

【参考方案1】:

试试下面的(因为窗口默认有.fullSizeContentView)

var body: some Scene 
    WindowGroup 
        ContentView()
          .frame(width: 1200, height: 800)    // << here !!
          .frame(minWidth: 800, maxWidth: .infinity, 
               minHeight: 600, maxHeight: .infinity)
    

【讨论】:

这行得通,但它使窗口保持固定大小并且无法调整大小,这在旧方法中是可能的。我曾尝试使用具有相同数字的“idealSize”,但我最终得到了一个较小的窗口,我总是需要调整它的大小。如果我尝试 (maxWidth: .infinity, maxHeight: .infinity) 我也会得到一个更小的窗口。在所有情况下,应用程序都会最小化。我假设“styleMask”包含缺失的部分? 好的,这有帮助!!!使用双 .frame 语句,窗口也可以调整大小。由于某种原因,仍然出现最小化。因此,如果有人对此有解决方案,我很乐意听到,但我现在将问题标记为已回答。谢谢! 不幸的是,这不适用于 Catalyst。有什么想法吗? 这在 Bug Sur 11.2.3 中用于设置窗口大小,但如果我调整窗口大小,它会移动子视图,而不是调整它们的大小。也就是说,左侧的 List 视图被推离窗口边界的左边缘。似乎是一个错误,我已经报告了。【参考方案2】:

我使用了换出最小尺寸的技巧。不优雅,但解决了问题。

struct ContentView: View

    @ObservedObject var document: MyDocument

    @State var minSize:CGSize = 
        // Set your preferred initial size here
        guard let screen = NSScreen.main?.frame.size
        else  return CGSize(width: 800, height: 600) 
        return CGSize(width: screen.width * 0.75, height: screen.height * 0.75)
    ()
    
    var body: some View
    
        VStack
        
            Text("Content")
        
        .frame(minWidth: minSize.width, minHeight: minSize.height)
        .onAppear 
            Task 
                await Task.sleep(500_000_000)
                // Set your real min size here
                minSize = CGSize(width: 600, height: 400)
            
        
    

希望下一个 SwiftUI 能有正常的方式。

【讨论】:

以上是关于基于文档的 MacOs 应用程序的 SwiftUI 窗口大小的主要内容,如果未能解决你的问题,请参考以下文章

使用 SwiftUI 在 MacOS 中的多列 TableViews

如何在 SwiftUI (macOS) 中拖放未捆绑的图像

macOS 基于文档的应用程序如何启动?

如何从基于 SwiftUI 文档的应用程序中将多个文件保存在包文件夹中?

SwiftUI:响应 macOS 上的应用程序终止

SwiftUI:如何在 macOS 应用程序中实现编辑菜单