You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

多平台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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 18:25:14