如何将视图设置为在状态更改时不更新

How to set a view to NOT update when a state changes

我正在尝试集成一个 ARKit 视图,该视图使用机器学习处理帧并将结果显示在屏幕上。我已经让 ARKit 视图与 UIViewRepresentable 一起工作,并且一切正常,直到状态发生变化。如何使 AR 视图静态并且在状态更改时不更新。我只想更新显示结果的标签。

这是我在状态更改时收到的错误:[CAMetalLayer nextDrawable] returning nil because allocation failed.

这大概是因为 arView 在处理帧时不断重新加载?不过不太确定。

这是视图的代码:

struct ARControlView: View {
    @EnvironmentObject var resultHandler: ResultHandler
    var body: some View {
        let arView = ARViewContainer() // This is the UIViewRepresentable containing the ARKit view.
        return ZStack {
            arView
            VStack {
                Text(self.resultHandler.gesture.rawValue)
            }
            .onAppear {
                arView.restartARSession()
            }
            .onDisappear {
                arView.pauseArSession()
            }
        }
    }
}

这是针对 ARViewContainer 的:

struct ARViewContainer: UIViewRepresentable {

    var arView = ARView(frame: .zero)
    @EnvironmentObject var resultHandler: ResultHandler

    func makeUIView(context: Context) -> ARView {
        arView.session.delegate = context.coordinator
        arView.session.run(AROrientationTrackingConfiguration())
        return arView
    }

    func pauseArSession() {
        arView.session.pause()
    }

    func restartARSession() {
        arView.session.run(AROrientationTrackingConfiguration())
    }

    func updateUIView(_ uiView: ARView, context: Context) {}

    class Coordinator: NSObject, ARSessionDelegate {
        // Process frames here...
    }

    func makeCoordinator() -> ARViewContainer.Coordinator {
        Coordinator(self)
    }
}

每次 resultHandler 中的状态发生变化时,body 都会在 ARControlView 中重新计算。

这会导致实例化一个新的 ARViewContainer let arView = ARViewContainer()body 变量中。

如果将 let arView = ARViewContainer() 移到 body 变量之外,则每次状态更改时 arView 都不会重新实例化。

我发现问题其实并不像看上去的那样。我收到的错误是由于框架被设置为 .zero,由于某种原因使其 return nil。还要将其设置为不自动配置,因为这也会产生导致图像被拉伸的奇怪问题。

这是我更改的行:

发件人:

var arView = ARView(frame: .zero)

收件人:

var arView = ARView(frame: .init(x: 1, y: 1, width: 1, height: 1), cameraMode: .ar, automaticallyConfigureSession: false)

感谢其他人的帮助,我很感激!