Мак-катализатор - как сделать окно минимального размера?

Mac катализатор позволяет изменить размер окна, в любом случае, чтобы обеспечить минимальный размер окна для приложения катализатора Mac?

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: Если вы установите оба minimumSize а также maximumSize с тем же значением размер окна останется неизменным и его нельзя будет изменить.

Вот расширенная версия отличного ответа @marcelosalloum..

Шаг 1. Откройте AppDelegate.swift.

Шаг 2. Найдите приложение func (), вставьте сюда свою версию кода @marcelosalloum (или вызовите функцию, которую вы создали для этого, как это сделал я).

Шаг 3. При желании можно утверждать, что ваш код работает только на платформах с подходящими API Swift (используйте #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. Затем я вызвал ее из application () в AppDelegate.swift (строка 18).

Внутри вашего делегата сцены вы можете сделать следующее:

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
}

Реализуйте класс 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 - используйте заголовок моста.

Objective-C версия ответа @marcelosalloum:

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

Использовать sizeRestrictions?.minimumSize или sizeRestrictions?.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)
}

Просто добавьте это в свой делегат сцены:

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

Я также добавил, как установить максимальный размер как максимально возможное значение:

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

Я провел небольшое исследование. Итак, я сделал следующее дополнение к моей сцене с функцией SceneDeleg ate:

  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
        }

Я не уверен, что если требуется предложение системного имени, поскольку window.windowScene.sizeRestrictoins равно нулю для iOS, но добавил это для ясного понимания и возможных будущих обновлений.

Я выбираю 1024x768 как наименьший размер iPad в альбомной ориентации (Catalyst сообщает об устройстве как iPad с Mac OS в ландшафтном режиме)

Другие вопросы по тегам