SpriteView状态变更不暂停SKScene及场景替换失效问题咨询
这两个问题均为iOS 15及以上版本SpriteView的已知系统bug,不属于使用逻辑错误。以下是对应的可行修复方案:
1. isPaused属性不生效问题
问题原因
SpriteView(scene:isPaused:)的isPaused参数仅会在视图首次初始化时读取一次,后续状态变更不会被SpriteView监听,因此无法同步更新底层SKView、SKScene的暂停状态。
修复方案
不依赖SpriteView的isPaused参数,直接操作SKScene本身的isPaused属性即可,修改按钮点击逻辑:
Button("Paused: \(paused)" as String) { paused.toggle() scene.isPaused = paused }
2. 更换SKScene不生效问题
问题原因
SpriteView会缓存首次传入的SKScene实例,后续即使传入新的实例,也不会触发底层场景的替换操作,旧场景会一直保留在内存中运行。
修复方案
给SpriteView添加一个与SKScene实例绑定的唯一id,当场景更换时id同步变化,触发SwiftUI强制销毁旧的SpriteView、创建新实例加载新场景:
SpriteView(scene: scene, isPaused: paused) .id(scene.name) // 可自行替换为任意和当前场景绑定的唯一标识 .ignoresSafeArea()
如果追求更好的性能,不想每次切换场景都重建SpriteView,也可以自行封装UIViewRepresentable持有底层SKView的引用,手动调用presentScene(_:)方法更换场景。
内容的提问来源于stack exchange,提问作者clns
相关产品推荐
相关产品推荐

