SwiftUI:如何使用非模拟器支持的框架和 PreviewProvider?

eiv*_*dml 5 swift arkit swiftui realitykit

我正在开发 RealityKit 应用程序,并使用 SwiftUI。

\n\n

当然,RealityKit 视图在 SwiftUIPreviewProvider预览中不起作用。但我的问题是,即使是简单且完全隔离的 SwiftUI 视图也无法预览,因为PreviewProvider编译整个项目。

\n\n

我的 SwiftUI View 类未以任何方式连接到 ARView 代码。如果我只需转到“文件”->“新建”并选择一个 SwiftUI 文件,然后尝试在画布中预览该文件就足够了(\xe2\x8c\xa5 + \xe2\x8c\x98 + \xe2\ x86\xb5),没有任何更改。然后它会给我那个错误。事实上我的中有任何代码.xcodeproj不受画布预览支持的代码,会出现错误。

\n\n

我收到这样的错误:

\n\n
Value of type \'ARView\' has no member \'installGestures\'\n
Run Code Online (Sandbox Code Playgroud)\n\n

我现在唯一的两个解决方案是 1)将文件复制到 Playground 并在那里进行实验,然后在完成后复制回来。2) 在处理视图之前,注释掉所有不受支持的 RealityKit 相关代码。

\n\n

问:当然,这些解决方案都不是最佳的。还有更好的解决方案吗?

\n

小智 3

我遇到了同样的问题。我的解决方案是使用 targetEnvironment(simulator) 编译器指令,如下所示:

struct ContentView : View {
    
    var body: some View {
            #if !targetEnvironment(simulator)
            ARViewContainer()
                .edgesIgnoringSafeArea(.all)
                .statusBar(hidden: true)
            #endif
        }
    }
}

#if !targetEnvironment(simulator)
struct ARViewContainer: UIViewRepresentable {
    
    func makeUIView(context: Context) -> ARView {
        let arView = ARView(frame: .zero)

        // ARKit / RealityKit specific code
        ...

        return arView
        
    }
    
    func updateUIView(_ arView: ARView, context: Context) {}
}
#endif
Run Code Online (Sandbox Code Playgroud)

进一步阅读:https://www.hackingwithswift.com/example-code/language/how-to-use-compiler-directives-to-detect-the-ios-simulator