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

设置scaleMode为resizeFill时,如何在didMove中获取SKScene的尺寸?

解决SKScene resizeFill模式下didMove中size为(0,0)的问题

我之前也踩过这个坑,当把SKScene的scaleMode设为.resizeFill时,didMove(to:)方法执行的时机刚好卡在场景和视图尺寸同步完成前,所以此时self.size会返回(0,0);而touchesBegan这类方法要到视图布局完全稳定后才会触发,这时候场景已经完成了尺寸适配,自然能拿到正确的数值。

解决方案1:直接使用SKView的尺寸

在didMove(to:)里,你可以直接用传入的view参数的尺寸来做初始化计算,因为此时视图的边界已经确定:

override func didMove(to view: SKView) {
    let sceneSize = view.bounds.size
    print(sceneSize) // 这里会输出正确的视图尺寸
    // 后续用sceneSize执行你的初始化逻辑
}

解决方案2:监听场景尺寸变化

如果需要在场景尺寸动态调整时也能响应(比如设备旋转后),可以重写didChangeSize(_:)方法,这个方法会在场景尺寸发生改变时被调用,包括初始化阶段的尺寸同步:

class GameScene: SKScene, SKPhysicsContactDelegate {
    override func didMove(to view: SKView) {
        // 这里处理不依赖尺寸的初始化工作
    }
    
    override func didChangeSize(_ oldSize: CGSize) {
        print(self.size) // 这里能拿到正确的场景尺寸
        // 在这里执行依赖尺寸的计算和布局调整
    }
    
    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
        print(self.size) // 正常获取尺寸
    }
}

问题根源说明

当设置scaleMode = .resizeFill时,SKScene会强制自身尺寸和SKView的边界完全匹配,你初始化场景时传入的UIScreen.main.bounds.size会被这个规则覆盖。但didMove(to:)是场景刚被添加到视图时就触发的,此时视图的布局流程还没走完,场景的尺寸同步操作还没执行,所以会出现self.size为(0,0)的情况。

内容的提问来源于stack exchange,提问作者Audus

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 07:16:37