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

时间:2020-03-14 08:38:48

标签: swift swiftui arkit

我正在尝试集成一个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)
    }
}

2 个答案:

答案 0 :(得分:0)

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

这将导致新的ARViewContainer实例化,原因是 let arView = ARViewContainer()位于body变量中。

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

答案 1 :(得分:-1)

我发现问题实际上并不是看起来的那样。我收到的错误是由于帧设置为.zero,由于某种原因使其返回nil。还要将其设置为不自动配置,因为这还会造成奇怪的问题,导致图像被拉伸。

这是我更改的行:

发件人:

var arView = ARView(frame: .zero)

收件人:

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

非常感谢其他人的帮助!