设置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
相关产品推荐
相关产品推荐

