Mac-catalyst - how to make window of min size?

Hir*_*ati 5 macos ios13 mac-catalyst

Mac catalyst allows to resize window, any way to provide minimum window size for Mac catalyst app?

mar*_*oum 20

只需将以下代码块添加到您的application:didFinishLaunchingWithOptions方法(对于UIKit项目)或scene(_:willConnectTo:options:)(对于SwiftUI项目):

UIApplication.shared.connectedScenes.compactMap { $0 as? UIWindowScene }.forEach { windowScene in
    windowScene.sizeRestrictions?.minimumSize = CGSize(width: 480, height: 640)
}
Run Code Online (Sandbox Code Playgroud)

PS:你也可以在maximumSize那里设置属性

PS2:如果您将minimumSize和都设置maximumSize为相同的值,则窗口大小将保持不变且无法调整大小。

  • 这还有效吗?我尝试运行此代码并添加 MaximumSize,但我可以在 Mac Catalyst 中随意调整窗口大小 (3认同)
  • @r4id4我发现在“didFinishLaunchingWithOptions”时,窗口场景尚未设置,因此它无法工作;添加延迟使其工作正常 (2认同)

Jam*_*ell 12

这是@marcelosalloum 出色答案的扩展版本。

步骤 1. 打开AppDelegate.swift

步骤 2. 找到func application(),在此处插入您的@marcelosalloum 代码版本(或像我一样调用您为此创建的函数)。

第 3 步。 可选择断言您的代码仅在具有合适 Swift API 的平台上运行(使用#available


示例代码(在AppDelegate.swift 中

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
    // Override point for customization after application launch.
    addWindowSizeHandlerForMacOS()

    return true
}

func addWindowSizeHandlerForMacOS() {
    if #available(iOS 13.0, *) {
        UIApplication.shared.connectedScenes.compactMap { $0 as? UIWindowScene }.forEach { windowScene in
            windowScene.sizeRestrictions?.minimumSize = CGSize(width: 800, height: 1100)
            windowScene.sizeRestrictions?.maximumSize = CGSize(width: 800, height: 1100)
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

示例截图

在我的应用程序,我定义的函数命名addWindowSizeHandlerForMacOS()开始上线23。然后我把它叫做从应用程序()AppDelegate.swift(第18行)。

Xcode 截图


Nik*_*nko 5

使用此方法实现 Objective-C 类:

 - (void)setMinimumSize:(CGSize)size {
     id app = NSClassFromString(@"NSApplication");
     id shared = [app valueForKeyPath:@"sharedApplication"];
     id mainWindow = [shared valueForKeyPath:@"mainWindow"];

     NSValue *nssize = [NSValue valueWithCGSize:size];
     [mainWindow setValue:nssize forKeyPath:@"minSize"];
 }
Run Code Online (Sandbox Code Playgroud)

从 Swift 调用 - 使用桥接头。


小智 5

在您的场景委托中,您可以执行以下操作:

func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
    // Use this method to optionally configure and attach the UIWindow `window` to the provided UIWindowScene `scene`.
    // If using a storyboard, the `window` property will automatically be initialized and attached to the scene.
    // This delegate does not imply the connecting scene or session are new (see `application:configurationForConnectingSceneSession` instead).
    guard let scene = (scene as? UIWindowScene) else { return }

    #if targetEnvironment(macCatalyst)
        scene.sizeRestrictions?.minimumSize = CGSize(width: 800, height: 1100)
        scene.sizeRestrictions?.maximumSize = CGSize(width: 1280, height: 1200)
    #endif
}
Run Code Online (Sandbox Code Playgroud)