Mac Catalyst - Mac Catalyst 应用的最小窗口大小

32

Mac Catalyst允许调整窗口大小,是否有办法为Mac Catalyst应用提供最小窗口大小?


这篇文章看起来很有前途。 - Iulian Onofrei
更新:之前链接的文章中提供的解决方案实际上对我有用。 - Iulian Onofrei
太好了,你能分享一下演示代码吗? - Hiren Gujarati
我会尝试创建一个演示项目,但可能不会在这周内完成,因为我正在度假。 - Iulian Onofrei
8个回答

27

只需将以下一块代码添加到您的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)
}

备注:你也可以在那里设置maximumSize属性。

备注2:如果你将minimumSizemaximumSize都设置为相同的值,窗口大小将保持不变且无法改变大小。


1
如何在 Mac 上运行 iOS 应用程序时获取窗口大小?宽度,因为高度对应笔记本电脑屏幕高度。可以理解的是,iOS 应用程序未在 Mac 上全屏运行。 - Markus
3
这还有效吗?我尝试运行这段代码,加入了maximumSize,但在Mac Catalyst上我仍然能够随意调整窗口大小。 - r4id4
3
@r4id4 我发现在 didFinishLaunchingWithOptions 中窗口场景还没有设置好,所以它不起作用;添加延迟可以使其正常工作。 - hyouuu

15
以下是@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)
        }
    }
}

示例截图

在我的应用程序中,我定义了一个名为addWindowSizeHandlerForMacOS()的函数,从第23行开始。然后我在AppDelegate.swiftapplication()中调用它(第18行)。

Xcode 截图


9

在您的场景代理中,您可以执行以下操作:

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
}

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"];
 }

使用桥接头文件可以从Swift调用。

是的,这就是我现在正在做的方式,https://gist.github.com/steipete/30c33740bf0ebc34a0da897cba52fefe - Hiren Gujarati
你能在启动时全屏吗? - Lim Thye Chean

4

@marcelosalloum的回答的Objective-C版本:

for (UIScene* scene in UIApplication.sharedApplication.connectedScenes) {
    if ([scene isKindOfClass:[UIWindowScene class]]) {
        UIWindowScene* windowScene = (UIWindowScene*) scene;
        windowScene.sizeRestrictions.minimumSize = CGSizeMake(480, 640);
    }
}

3

使用sizeRestrictions?.minimumSizesizeRestrictions?.maximumSize来设置您的 Mac 应用程序窗口的最小或最大尺寸。

打开您的SceneDelegate并执行以下操作:

func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
   guard let scene = (scene as? UIWindowScene) else { return }

   scene.sizeRestrictions?.minimumSize = CGSize(width: 800, height: 600)
   scene.sizeRestrictions?.maximumSize = CGSize(width: 800, height: 600)
}

2

只需将以下内容添加到您的Scene Delegate中:

window?.windowScene?.sizeRestrictions?.minimumSize = CGSize(width: 900.0, height: 750.0)

我还添加了如何将最大大小设置为最大可能值的说明:

我还添加了如何将最大大小设置为最大可能值的说明:

window?.windowScene?.sizeRestrictions?.maximumSize = CGSize(width: CGFloat.greatestFiniteMagnitude, height: CGFloat.greatestFiniteMagnitude)

如果你使用SwiftUIApp,那么SceneDelegate就不再需要了。你有关于SwiftUIApp的解决方案吗? - RawMean

0

我做了一些小研究。因此,我在我的SceneDelegate的func scene中添加了以下内容:

  func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
        if UIDevice.current.systemName.contains("Mac") {
            window?.windowScene?.sizeRestrictions?.minimumSize = CGSize(width: 1024, height: 768)
        } else {
           // iOS - nothing to change
        }

我不确定在iOS中是否需要系统名称子句,因为window.windowScene.sizeRestrictoins为nil,但是为了清楚理解和可能的未来更新,我添加了它。

我选择1024x768作为最小的iPad横向尺寸(Catalyst将设备报告为带有Mac OS的iPad横向模式)。


有没有想法在没有SceneDelegate的情况下如何实现这一点。当应用程序是SwiftUIApp时,就没有SceneDelegate了。 - RawMean

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