多平台Xcode SpriteKit应用:macOS窗口大小及初始位置设置方法
解决macOS端SpriteKit窗口固定尺寸、支持全屏及初始位置设置问题
嘿,作为刚接触多平台SpriteKit开发的新手,这个问题确实容易找不到清晰的答案,我来一步步帮你搞定!
核心需求拆解
你需要在macOS端实现三个关键点:
- 窗口固定尺寸,不可拉伸
- 支持全屏模式
- 设置窗口初始位置(比如居中屏幕)
而iPhone端因为系统限制,无需处理窗口大小,我们用条件编译来区分平台即可,不会影响iOS端的运行。
代码实现步骤
下面是直接可用的代码,我会逐行解释:
import SwiftUI import SpriteKit @main struct YourMultiPlatformApp: App { var body: some Scene { WindowGroup { SpriteView(scene: GameScene()) .ignoresSafeArea() .onAppear { #if os(macOS) // 获取当前应用的主窗口 guard let mainWindow = NSApplication.shared.windows.first else { return } // 1. 设置固定窗口尺寸 let fixedWindowSize = CGSize(width: 800, height: 600) // 改成你想要的尺寸 mainWindow.contentSize = fixedWindowSize // 锁定最小/最大尺寸,彻底禁止拉伸 mainWindow.minSize = fixedWindowSize mainWindow.maxSize = fixedWindowSize // 2. 配置窗口样式:支持全屏,移除可调整大小的权限 mainWindow.styleMask.remove(.resizable) // 去掉可拉伸样式 mainWindow.styleMask.insert(.fullScreen) // 添加全屏支持 // 保留基础窗口样式(标题栏、关闭/最小化按钮) mainWindow.styleMask.formUnion([.titled, .closable, .miniaturizable]) // 3. 设置初始位置:居中屏幕 if let screenFrame = NSScreen.main?.frame { let originX = (screenFrame.width - fixedWindowSize.width) / 2 let originY = (screenFrame.height - fixedWindowSize.height) / 2 mainWindow.setFrameOrigin(CGPoint(x: originX, y: originY)) } #endif } } } }
关键代码说明
- 条件编译:
#if os(macOS)包裹的代码只会在macOS上执行,完全不影响iPhone端的逻辑 - 锁定窗口尺寸:同时设置
contentSize、minSize和maxSize为同一个值,双重保障窗口不能被拉伸 - 窗口样式配置:移除
.resizable禁止调整大小,添加.fullScreen让窗口支持全屏模式,同时保留标题栏和基础操作按钮 - 初始位置计算:通过屏幕尺寸减去窗口尺寸,取一半得到居中的坐标,用
setFrameOrigin设置窗口初始位置
额外提示
如果你是用故事板创建窗口,也可以在故事板里先设置基础样式,再用代码覆盖细节,但代码方式更灵活,适合多平台项目的统一管理。
内容的提问来源于stack exchange,提问作者random dude
相关产品推荐
相关产品推荐

