如何为 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
}
就这么简单。
我有一个已启用 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
}
就这么简单。