是否可以在Mac Catalyst中使用全屏显示?

时间:2019-10-23 15:23:20

标签: ios maccatalyst

将游戏移植到Mac Catalyst-但窗口很小。可以全屏启动吗?

4 个答案:

答案 0 :(得分:3)

没有简单的设置可以显示“开始全屏”。但是您可以在启动时设置窗口的框架。

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

答案 1 :(得分:3)

您可以使用Dynamic一行来完成此操作:

Dynamic.NSApplication.sharedApplication.windows.firstObject.toggleFullScreen(nil)

答案 2 :(得分:1)

,可以全屏启动。

这有点棘手,但有可能。要切换到全屏模式,您需要使用AppKit和NSApplication类,但目前在Mac Catalyst应用程序中直接不可用。但是,您可以从另一个插件包访问它。您可以通过以下方法在应用启动时切换到全屏模式:

步骤1 。您需要在应用中创建一个新的mac bundle目标。单击文件->新建->目标-> macOS->捆绑,然后单击下一步按钮。输入产品名称,例如MacBundle,然后单击完成按钮。

步骤2。在项目中选择新创建的MacBundle组,然后单击文件->新建-> macOS-> Cocoa类,然后单击按钮下一步。输入类名称,例如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步。单击项目,然后在“目标”部分中选择主应用程序目标(与iOS相同)

第6步。在“常规”标签中,向下滚动到“框架,库和嵌入内容”部分,然后单击+按钮。在用于选择框架的新弹出窗口中,选择MacBundle.bundle,然后单击“添加”按钮将此捆绑包嵌入到主应用中。

步骤7。现在,您可以从iOS的主要代码中MacBundle中的MacApp类中调用toggleFullScreen方法。要使其正常工作,您可以从应用程序中出现的第一个UIViewController的viewDidAppear中调用一次。您可以这样称呼它:

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
    }
}

或者,您可以使用该toggleFullScreen方法创建协议。

之后,当您启动该应用程序时,它将自动切换到全屏显示。

答案 3 :(得分:0)

要摆脱步骤7中的警告:

    Bundle(path: Bundle.main.builtInPlugInsPath?.appending("/MacBundle.bundle") ?? "")?.load()
        
    let macClass: AnyClass? = NSClassFromString("MacApp")
        
    let macApp = macClass as AnyObject as? NSObjectProtocol
        
    macApp?.perform(NSSelectorFromString("toggleFullScreen"))