Как установить представление НЕ обновлять при изменении состояния - PullRequest
1 голос
/ 14 марта 2020

Я пытаюсь интегрировать представление ARKit, которое обрабатывает фреймы с машинным обучением и показывает результаты на экране. Я получил представление ARKit для работы с UIViewRepresentable, и все работает, пока состояние не изменится. Как мне сделать AR view stati c и не обновлять при изменении состояния. Я только хочу обновить метку, которая показывает результат.

Это ошибка, которую я получаю при изменении состояния: [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 голосов
/ 15 марта 2020

Я обнаружил, что проблема на самом деле не такова, как казалось. Ошибка, которую я получал, была вызвана тем, что для фрейма было установлено значение .zero, что по какой-то причине вернуло ноль. Также установите для него автоматическую настройку, поскольку это также создало странную проблему, приводящую к растяжению изображения.

Это была строка, которую я изменил:

От:

var arView = ARView(frame: .zero)

To:

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

Спасибо за любую помощь, я ценю это!

0 голосов
/ 14 марта 2020

Каждый раз, когда происходит изменение состояния в resultHandler, body переоценивается в ARControlView.

Это вызывает создание нового ARViewContainer из-за того, что let arView = ARViewContainer() находится внутри переменной body.

Если вы переместите let arView = ARViewContainer() за пределы переменной body, arView не будет восстанавливаться каждый раз при изменении состояния.

...