点击SwiftUI按钮导致SpriteKit动画重置,这是系统Bug吗?
问题原因
这个现象不是系统Bug,是你的SKScene定义方式导致的。
你当前将scene声明为ContentView的计算属性,只要ContentView发生重绘(比如点击按钮触发了状态变更、触发视图刷新),就会重新执行计算属性的逻辑,生成一个全新的GameScene实例,原来正在运行动画的旧场景会被直接替换,表现出来就是动画被重置。
解决方案
只需要把scene改为只会初始化一次的存储属性,用@State修饰即可保证它在ContentView的整个生命周期内只会被创建一次,不会随视图重绘反复生成:
struct ContentView: View { // 用@State + 闭包初始化,全局唯一实例 @State private var scene: SKScene = { let scene = GameScene() scene.size = CGSize(width: 1125, height: 2436) scene.scaleMode = .fill return scene }() var body: some View { SpriteView(scene: scene) .frame(maxWidth: .infinity, maxHeight: .infinity) .ignoresSafeArea() } }
额外优化建议
你原有代码里用UIScreen.main.bounds获取尺寸的写法可以替换为maxWidth: .infinity、maxHeight: .infinity,适配性更好,同时也避开了UIScreen.main在iOS 16+被废弃的问题。
内容的提问来源于stack exchange,提问作者juicysquid
相关产品推荐
相关产品推荐

