Mac-catalyst - Mac 催化剂应用程序的最小窗口大小

Posted

技术标签:

【中文标题】Mac-catalyst - Mac 催化剂应用程序的最小窗口大小【英文标题】:Mac-catalyst - minimum window size for Mac catalyst app 【发布时间】:2019-11-29 02:28:53 【问题描述】:

Mac 催化剂允许调整窗口大小,有没有办法为 Mac 催化剂应用程序提供最小窗口大小?

【问题讨论】:

This article 看起来很有希望。 更新:之前链接文章中的解决方案实际上对我有用。 哦,太好了,你能分享一下演示代码吗? 我将尝试创建一个演示项目,但本周可能不会,因为我正在休假。 【参考方案1】:

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

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

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

【讨论】:

ios App在Mac上运行时如何获取窗口大小?宽度,因为高度对应笔记本电脑屏幕的高度。据了解,iOS App在Mac上没有全屏运行。 这还能用吗?我尝试运行此代码并添加 maximumSize 但我可以在 Mac Catalyst 中随意调整窗口大小 @r4id4 我发现在didFinishLaunchingWithOptions 上,窗口场景还没有设置,所以它不起作用;添加延迟使其正常工作【参考方案2】:

这是@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)
        
    


示例截图

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

【讨论】:

【参考方案3】:

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

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

【讨论】:

【参考方案4】:

用这个方法实现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 调用 - 使用桥接头。

【讨论】:

是的,我现在就是这样做的,gist.github.com/steipete/30c33740bf0ebc34a0da897cba52fefe 你可以在开始时全屏吗?【参考方案5】:

@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);
    

【讨论】:

【参考方案6】:

只需将其添加到您的场景委托中:

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 的解决方案吗?【参考方案7】:

使用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)

【讨论】:

【参考方案8】:

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

  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 将设备报告为 iPad,Mac OS 处于横向模式)

【讨论】:

知道如何在没有 SceneDelegate 的情况下执行此操作。应用为SwiftUIApp时,没有SceneDelegate

以上是关于Mac-catalyst - Mac 催化剂应用程序的最小窗口大小的主要内容,如果未能解决你的问题,请参考以下文章

模态对话框在基于 Mac 催化剂场景的应用程序中中断响应者链

为 mac 催化剂的 info.plist 文件中的键设置不同的值

为 mac 催化剂的 info.plist 文件中的键设置不同的值

将 Mac 催化剂二进制文件上传到 App Store 连接时出现问题

使用催化剂移植到 mac 时排除 pod

如何在 Mac 上的 Mac Catalyst 应用程序中使用钥匙串?