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

如何在Xcode SwiftUI预览中显示非AR的RealityKit视图?

问题分析与解决方法

Xcode的SwiftUI预览环境不支持ARView的实时渲染,因为ARView依赖ARKit会话,而预览环境没有初始化ARKit所需的硬件模拟层(比如摄像头追踪、空间感知等),所以无法加载并显示AR场景。不过可以通过以下两种方案实现预览3D内容的需求:


方案一:使用SwiftUI原生RealityView(iOS 16+推荐)

RealityView是iOS 16及以上版本推出的SwiftUI原生RealityKit视图,无需依赖AR会话即可渲染3D内容,完美支持SwiftUI预览。我们可以通过编译条件区分预览和真机环境:

struct ContentView : View {
    var body: some View {
        #if DEBUG
        // 预览环境使用RealityView渲染3D内容
        RealityView { content in
            do {
                let boxAnchor = try Experience.loadBox()
                content.add(boxAnchor)
            } catch {
                print("加载锚点失败: \(error)")
            }
        }
        .background(Color.systemBackground)
        .edgesIgnoringSafeArea(.all)
        #else
        // 真机/模拟器环境使用ARView
        ARViewContainer().edgesIgnoringSafeArea(.all)
        #endif
    }
}

// 保留原ARViewContainer,供真机AR场景使用
struct ARViewContainer: UIViewRepresentable {
    func makeUIView(context: Context) -> ARView {
        let arView = ARView(frame: .zero)
        let boxAnchor = try! Experience.loadBox()
        arView.environment.background = .color(.systemBackground)
        arView.scene.anchors.append(boxAnchor)
        return arView
    }
    
    func updateUIView(_ uiView: ARView, context: Context) {}
}

struct ContentView_Previews : PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}

方案二:静态RealityKit视图(兼容iOS 15及以下)

如果需要支持更低iOS版本,可以创建一个不依赖AR会话的静态RealityKit视图,直接渲染3D内容:

// 静态RealityKit视图,用于预览
struct StaticRealityView: UIViewRepresentable {
    func makeUIView(context: Context) -> RealityKit.View {
        let realityView = RealityKit.View(frame: .zero)
        do {
            let boxAnchor = try Experience.loadBox()
            let scene = RealityKit.Scene()
            scene.addAnchor(boxAnchor)
            realityView.scene = scene
            realityView.environment.background = .color(.systemBackground)
        } catch {
            print("加载锚点失败: \(error)")
        }
        return realityView
    }
    
    func updateUIView(_ uiView: RealityKit.View, context: Context) {}
}

struct ContentView : View {
    var body: some View {
        #if DEBUG
        // 预览用静态视图
        StaticRealityView().edgesIgnoringSafeArea(.all)
        #else
        // 真机用ARView
        ARViewContainer().edgesIgnoringSafeArea(.all)
        #endif
    }
}

// 保留原ARViewContainer
struct ARViewContainer: UIViewRepresentable {
    func makeUIView(context: Context) -> ARView {
        let arView = ARView(frame: .zero)
        let boxAnchor = try! Experience.loadBox()
        arView.environment.background = .color(.systemBackground)
        arView.scene.anchors.append(boxAnchor)
        return arView
    }
    
    func updateUIView(_ uiView: ARView, context: Context) {}
}

struct ContentView_Previews : PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}

关键说明

两种方案的核心逻辑都是:在预览环境中用非AR的RealityKit渲染方式替代ARView,既能在SwiftUI预览窗口中实时查看3D效果,又能保证真机/模拟器环境下正常运行AR功能。

内容的提问来源于stack exchange,提问作者foolinaroundz

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 04:45:21