ARKit CoachingOverlay in SwiftUI

Viewed 324

Using Madison Gipson's implementation of ARSCNView in SwiftUI, and I'd like to add an ARKit CoachingOverlay to my ARView before it renders onto an anchor.

I've tried adding this Extension but it throws errors I don't know how to solve (see code).

I've also tried to take hints from Apple's ARKit demo which implements CoachingOverlay, but without luck.

import SwiftUI
import Foundation
import ARKit

@main
struct Window: App {
    var body: some Scene {
        WindowGroup {
            ARViewContainer()
        }
    }
}

struct ARViewContainer: UIViewControllerRepresentable {
    
    func makeUIViewController(context: Context) -> ARView {
        return ARView()
    }
    func updateUIViewController(_ uiViewController: ARView, context: Context) { }
    
}

class ARView: UIViewController, ARSCNViewDelegate {
    
    var arView: ARSCNView {
        return self.view as! ARSCNView
    }
    override func loadView() {
        self.view = ARSCNView(frame: .zero)
    }
    override func viewDidLoad() {
        super.viewDidLoad()
        arView.delegate = self
        arView.scene = SCNScene()
        setupCoachingOverlay() // <------------------------------- set up coaching overlay.
    }
    override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(animated)
    }
    override func viewDidLayoutSubviews() {
        super.viewDidLayoutSubviews()
    }
    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
        let configuration = ARWorldTrackingConfiguration()
        arView.session.run(configuration)
        arView.delegate = self
    }
    override func viewWillDisappear(_ animated: Bool) {
        super.viewWillDisappear(animated)
        arView.session.pause()
    }
    func sessionWasInterrupted(_ session: ARSession) {}
    func sessionInterruptionEnded(_ session: ARSession) {}
    func session(_ session: ARSession, didFailWithError error: Error) {}
    func session(_ session: ARSession, cameraDidChangeTrackingState
                    camera: ARCamera) {}
}

extension ARView: ARCoachingOverlayViewDelegate {
    
    func setupCoachingOverlay() {
        let coachingOverlay = ARCoachingOverlayView()
        coachingOverlay.delegate = self
        coachingOverlay.session = self.session // ERROR: Type of expression is ambiguous without more context
        coachingOverlay.autoresizingMask = [.flexibleWidth, .flexibleHeight]
        coachingOverlay.goal = .anyPlane
        self.addSubview(coachingOverlay) // ERROR: Value of type 'ARView' has no member 'addSubview'
    }
    
}
0 Answers
Related