将游戏移植到Mac Catalyst-但窗口很小。可以全屏启动吗?
答案 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"))