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

点击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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.10 15:03:02