iPhone/iPad下RealityView全屏覆盖时相机画面不显示的问题求助
iPhone/iPad下RealityView全屏覆盖时相机画面不显示的问题求助
我之前碰到过一模一样的问题,这本质是AR会话资源冲突导致的——iOS系统默认一个应用同时只能运行一个活跃的AR会话。当你通过fullScreenCover弹出ChildView时,ParentView里的RealityView已经占用了AR会话资源,ChildView尝试创建新的会话时无法获取相机权限,就会出现黑屏;而直接显示ChildView时,只有一个会话在运行,系统能正常分配相机资源,所以一切正常。
给你几个可行的解决方案:
方案1:共享AR会话(推荐)
在ParentView中创建一个全局的ARSession实例,传递给ChildView,让两个RealityView共用同一个会话,这样就能复用相机feed,避免冲突。
修改后的代码如下:
import RealityKit import SwiftUI struct ParentView: View{ @State private var showIt = false // 创建共享的AR会话 @State private var arSession = ARSession() var body: some View{ ZStack{ RealityView{content in content.camera = .virtual content.session = arSession // 绑定共享会话 let box = ModelEntity(mesh: MeshResource.generateSphere(radius: 0.2),materials: [createSimpleMaterial(color: .red)]) content.add(box) } Button("Click here"){ showIt = true } } .fullScreenCover(isPresented: $showIt){ ChildView(session: arSession) // 传递会话给ChildView .overlay( Button("Close"){ showIt = false }.padding(20), alignment: .bottomLeading ) } .ignoresSafeArea(.all) } // 补充你原来的createSimpleMaterial方法(假设你有这个实现) private func createSimpleMaterial(color: UIColor) -> SimpleMaterial { return SimpleMaterial(color: color, isMetallic: false) } } import ARKit import RealityKit import SwiftUI struct ChildView: View{ let session: ARSession // 接收共享会话 var body: some View{ RealityView{content in content.camera = .spatialTracking content.session = session // 使用共享会话 } } }
方案2:手动管理会话的暂停与恢复
如果你不想共享会话,可以在弹出ChildView时暂停ParentView的会话,关闭时恢复,确保同一时间只有一个会话活跃:
// ParentView中修改fullScreenCover部分 .fullScreenCover(isPresented: $showIt, onDismiss: { // 关闭ChildView时恢复ParentView的会话 arSession.run(ARConfiguration()) }){ ChildView() .overlay( Button("Close"){ showIt = false }.padding(20), alignment: .bottomLeading ) .onAppear { // 显示ChildView时暂停ParentView的会话 arSession.pause() } }
注意这种方法需要你在ParentView中同样持有arSession实例,并在RealityView中绑定它。
这两种方法都能解决你遇到的黑屏问题,推荐第一种共享会话的方式,它的体验更流畅,不会有会话切换的卡顿感。
内容来源于stack exchange
相关产品推荐
相关产品推荐

