如何为 Mac Catalyst 应用程序设置 default/preferred window 大小?

How to set a default/preferred window size for a Mac Catalyst app?

我有一个已启用 Catalyst 的 iOS 应用程序。应用程序中的一个功能打开一个新的 window。默认情况下,这个 window 打开时非常大,但我需要一种方法将其默认缩小。我知道您可以设置 windowScene.sizeRestrictions?.minimumSize.maximumSize,但这会将 window 限制为我喜欢的大小。我想这样做 window 打开一定的大小,默认情况下说 500x800,但可以由用户扩展到他们想要的任何大小。

我在SceneDelegate中试过window?.frame = CGRect(origin: .zero, size: CGSize(width: 500, height: 800)),但是没有效果。

视觉示例:

我已经弄明白了,以后我会帮助任何人解决这个问题。将 .maximumSize 设置为您的首选尺寸。然后在设置 window 后,使用 DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) { 再次设置 .maximumSize,但这次你想要的是实际最大 window 大小。

我的完整代码:

func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
        guard let windowScene = (scene as? UIWindowScene) else { return }
        
        #if targetEnvironment(macCatalyst)
        let toolbarDelegate = NewSchoolworkToolbar()
        let toolbar = NSToolbar(identifier: "main")
        windowScene.title = "New Schoolwork"
        if let titlebar = windowScene.titlebar {
            titlebar.toolbar = toolbar
            titlebar.toolbarStyle = .unified
            titlebar.separatorStyle = .shadow
        }
        #endif
        
        if let windowScene = scene as? UIWindowScene {
            let window = UIWindow(windowScene: windowScene)
            let newClassworkView = NewClassworkTableViewController()
            
            
            windowScene.sizeRestrictions?.minimumSize = CGSize(width: 400, height: 500)
            // This will be your "preferred size"
            windowScene.sizeRestrictions?.maximumSize = CGSize(width: 500, height: 800)
            
            window.rootViewController = newClassworkView
            self.window = window
            window.makeKeyAndVisible()
        }
        DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) {
            // This will be your actual size.
            windowScene.sizeRestrictions?.maximumSize = CGSize(width: 9000, height: 9000)
        }
    }

遵循 Dylan 的重要提示,

func tidyCatalystWindow() {
    #if targetEnvironment(macCatalyst)
    UIApplication.shared.connectedScenes.compactMap { [=10=] as? UIWindowScene }
     .forEach { ws in
        ws.sizeRestrictions?.minimumSize = CGSize(width: 500, height:800)
        ws.sizeRestrictions?.maximumSize = CGSize(width: 500, height: 800)
        DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) {
            ws.sizeRestrictions?.maximumSize = CGSize(width: 9000, height: 9000)
        }
    }
    #endif
}

就这么简单。