Можно ли использовать полноэкранный режим в Mac Catalyst? - PullRequest
3 голосов
/ 23 октября 2019

Портирование игры на Mac Catalyst - но окно довольно маленькое. Можно ли запустить в полноэкранном режиме?

Ответы [ 2 ]

3 голосов
/ 23 октября 2019

Там нет простой настройки, которая говорит «начать полный экран». Но вы можете установить рамку окна при запуске.

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

    #if targetEnvironment(macCatalyst)
    window?.frame = CGRect(origin: .zero, size: CGSize(width: 1600, height: 1000))
    #endif

Очевидно, что это не идеально, потому что вы не хотите жестко задавать определенный размер.

Вы можете получить размер экрана следующим образом. Но в моих собственных тестах возвращаемое значение не является точным. Это может быть ошибкой в ​​Mac Catalyst.

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

    #if targetEnvironment(macCatalyst)
    let screen = winScene.screen
    let size = screen.nativeBounds.size
    window?.frame = CGRect(origin: .zero, size: size)
    #endif
}

Это делает его больше, но это не совсем полноэкранный режим, потому что, по крайней мере в моих тестах, возвращаемый размер экрана фактически не соответствует размеру экрана.

Но это должно дать вам несколько идей.

Вы также можете установить минимальный и максимальный размер на вашем экране:

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

    #if targetEnvironment(macCatalyst)
    if let sizes = winScene.sizeRestrictions {
        let screen = winScene.screen
        let size = screen.nativeBounds.size
        sizes.minimumSize = size
        sizes.maximumSize = size
    }
    #endif
}

В этом примере экран выиграл 'не может быть изменяемого размера, потому что и min и max одинаковы. Отрегулируйте в соответствии с потребностями вашего приложения. Если вы задаете разные значения для минимального и максимального значений, вы также можете комбинировать это с установкой рамки окна, если хотите, чтобы начальный размер находился между настройками минимального и максимального значений.


Вот то же решениев Objective-C:

- (void)scene:(UIScene *)scene willConnectToSession:(UISceneSession *)session options:(UISceneConnectionOptions *)connectionOptions {
    if (![scene isKindOfClass:[UIWindowScene class]]) { return; }

    UIWindowScene *winScene = (UIWindowScene *)scene;

#if TARGET_OS_MACCATALYST
    UISceneSizeRestrictions *sizes = winScene.sizeRestrictions;
    if (sizes) {
        UIScreen *screen = winScene.screen;
        CGSize size = screen.nativeBounds.size;
        sizes.minimumSize = size;
        sizes.maximumSize = size;
    }
#endif
0 голосов
/ 03 ноября 2019

Да можно запустить в полноэкранном режиме.

Это немного сложно, но это возможно. Вам нужно использовать AppKit и класс NSApplication из другого пакета плагинов. Вот как вы можете переключиться в полноэкранный режим при запуске приложения:

Шаг 1. Вам необходимо создать новую цель Mac Macle в своем приложении. Нажмите Файл -> Создать -> Цель -> macOS -> Пакет, а затем нажмите кнопку Далее. Введите название продукта, например, MacBundle, и нажмите кнопку Готово.

Шаг 2. Выберите вновь созданную группу MacBundle в своем проекте и нажмите Файл -> Создать -> macOS -> Класс какао инажмите кнопку Далее. Введите имя класса, например, MacApp, которое является подклассом NSObject, и установите для языка значение Objective-C. Нажмите Далее, убедитесь, что цель MacBundle выбрана, и нажмите кнопку Создать.

Шаг 3. Отредактируйте MacApp.h так:

#import <Foundation/Foundation.h>
#import <AppKit/AppKit.h>

NS_ASSUME_NONNULL_BEGIN

@interface MacApp : NSObject

+ (void)toggleFullScreen;

@end

NS_ASSUME_NONNULL_END

Шаг4. Отредактируйте MacApp.m следующим образом:

#import "MacApp.h"

@implementation MacApp

+ (void)toggleFullScreen {
    [[[[NSApplication sharedApplication] windows] firstObject] toggleFullScreen:nil];
}

@end

Шаг 5. Нажмите на свой проект и в разделе Targets выберите цель своего основного приложения (то же, что для iOS)

Шаг 6. На вкладке Общие прокрутите вниз до раздела Фреймворки, Библиотеки и Внедренное содержимое и нажмите кнопку +. В новом всплывающем окне выбора фреймворка выберите MacBundle.bundle и нажмите кнопку «Добавить», чтобы встроить этот пакет в основное приложение.

Шаг 7. Теперь вы можете вызывать метод toggleFullScreen из класса MacApp, которыйв MacBundle из вашего основного кода iOS. Чтобы заставить его работать, вы можете вызвать его один раз из viewDidAppear из первого UIViewController, который появляется в вашем приложении. Вы можете назвать это следующим образом:

static var needsFullScreen = true

override func viewDidAppear(_ animated: Bool) {
    super.viewDidAppear(animated)

    if Self.needsFullScreen {
        Bundle(path: Bundle.main.builtInPlugInsPath?.appending("/MacBundle.bundle") ?? "")?.load()
        let macApp = NSClassFromString("MacApp") as? NSObjectProtocol
        macApp?.perform(NSSelectorFromString("toggleFullScreen"))
        Self.needsFullScreen = false
    }
}

После этого при запуске приложения оно автоматически переключится в полноэкранный режим.

...