[英]Is it possible to use full screen in Mac Catalyst?
将游戏移植到 macOS Catalyst,但 window 非常小。 是否可以全屏启动?
是的,可以全屏启动。
要切换到全屏,您需要使用 AppKit 和 NSApplication class 但目前在 Mac Catalyst 应用程序中不可用。 但是,您可以从另一个插件包访问它。 这就是您执行此操作并在应用启动时切换到全屏的方式:
第 1 步。您需要在您的应用程序中创建一个新的 mac 捆绑目标。 单击文件 -> 新建 -> 目标 -> macOS -> 捆绑包,然后单击下一步按钮。 输入产品名称,例如 MacBundle,然后单击完成按钮。
步骤 2. Select 在您的项目中新创建的组 MacBundle 并单击 File -> New -> macOS -> Cocoa Class 并单击 Next 按钮。 输入 class 名称,例如 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 步。单击您的项目并在目标部分 select 您的主要应用程序目标(与 iOS 相同)
第 6 步。在“常规”选项卡中,向下滚动到“框架”、“库”和“嵌入内容”部分,然后单击 + 按钮。 在用于选择框架 select MacBundle.bundle 的新弹出窗口中,然后单击按钮添加以将此捆绑包嵌入到您的主应用程序中。
第 7 步。现在您可以从主 iOS 代码的 MacBundle 中的 MacApp class 调用 toggleFullScreen 方法。 要使其正常工作,您可以从 app 中出现的第一个 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 方法创建一个协议。
之后,当您启动应用程序时,它将自动切换到全屏。
如果您不打算使用其他 AppKit 的东西,那么对于上一个方法中显示的这个 toggleFullScreen 调用,您可以从出现在您的应用程序中的第一个 UIViewController 的 viewDidAppear 中调用它,而无需使用运行时函数的插件包一次,如下所示:
static var needsFullScreen = true
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
if Self.needsFullScreen {
(NSClassFromString("NSApplication")?.value(forKeyPath: "sharedApplication.windows") as? [AnyObject])?.first?.perform(Selector("toggleFullScreen:"))
Self.needsFullScreen = false
}
}
没有简单的设置说“开始全屏”。 但是您可以在启动时设置窗口的框架。
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
}
在此示例中,屏幕不会调整大小,因为最小值和最大值相同。 调整以适应您的应用程序的需求。 如果您为最小值和最大值提供不同的值,如果您希望初始大小介于最小值和最大值设置之间,也可以将其与设置 window 框架结合使用。
这是 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
您可以使用Dynamic单行来完成:
Dynamic.NSApplication.sharedApplication.windows.firstObject.toggleFullScreen(nil)
要消除第 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"))
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.