簡體   English   中英

Mac-catalyst - Mac 催化劑應用程序的最小窗口大小

[英]Mac-catalyst - minimum window size for Mac catalyst app

Mac 催化劑允許調整窗口大小,有沒有辦法為 Mac 催化劑應用程序提供最小窗口大小?

只需將以下代碼塊添加到您的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設置為相同的值,則窗口大小將保持不變且無法調整大小。

這是@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.swift 中的application()調用它(第 18 行)。

Xcode 截圖

使用此方法實現 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 調用 - 使用橋接頭。

在您的場景委托中,您可以執行以下操作:

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
}

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

只需將此添加到您的場景委托中:

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

我還添加了如何將最大大小設置為最大可能值:

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

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

我做了一個小調查。 所以我在我的 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 為零,但添加了這個是為了清楚地理解和可能的未來更新。

我選擇 1024x768 作為最小的 iPad 橫向尺寸(Catalyst 將設備報告為 Mac OS 橫向模式下的 iPad)

 if isMacCatalyst() {
        UIApplication.shared.connectedScenes.compactMap { $0 as? UIWindowScene }.forEach { windowScene in
            windowScene.sizeRestrictions?.minimumSize = CGSize(width: 600, height: 896)
        }
 }

public func isMacCatalyst() -> Bool {
     #if targetEnvironment(macCatalyst)
     return true
     #else
     return false
     #endif
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM