SwiftUI文档型MacOS应用程序的窗口大小

7

我正在将我的应用从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的情况下实现相同的效果?
3个回答

2
在macOS 13.0.1中,这个功能是可用的:
    var
    body: some Scene
    {
        DocumentGroup(newDocument: MyDocument())  //  Or WindowGroup
        { file in
            ContentView(document: file.$document)
        }
        .defaultSize(width: 200, height: 400)     //  <-- Set your default size here.
    }

请注意,应用程序状态恢复可能会让事情变得混乱,但创建新文档(或删除应用程序状态)应该会创建一个具有指定默认值的新窗口。

1
在找到这个答案之前,我已经花了几个小时的时间来解决这个问题。这是唯一有效的方法。我在我的WindowGroup中添加了.defaultSize,现在默认大小已经正确了。 - Ricky Kresslein

2
尝试以下操作(默认情况下,窗口具有.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”包含了缺失的部分? - ramnefors
好的,这很有帮助!使用双.frame语句,窗口也可以调整大小。但出于某种原因,它仍然以最小化状态出现。如果有人有解决方法,我很乐意听取,但现在我将标记问题已回答。谢谢! - ramnefors
不幸的是,这对催化剂不起作用。有什么想法吗? - Burgler-dev
这段代码在Bug Sur 11.2.3中可以设置窗口大小,但如果我调整窗口大小,它会移动子视图而不是调整它们的大小。也就是说,左侧的列表视图被推到了窗口边界的左侧。看起来像是一个错误,我已经报告了。 - Rick
在macOS 13上,这对我不起作用。它只是使我的窗口内的内容成为指定的大小,而窗口仍然是默认的大小(更大)。 - Rick

0

我使用了替换最小尺寸的技巧。虽然不太优雅,但它解决了问题。

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会有一种正常的方式。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接