Отображение представления SwiftUI в приложении ARKit - PullRequest
1 голос
/ 11 апреля 2020

У меня есть приложение, в котором я обнаруживаю изображение и показываю пользовательский интерфейс на плоскости поверх обнаруженных изображений. Ранее я имел успех в отображении UIViewController на плоскости в приложении SceneKit ARKit. Я пытаюсь показать вид SwiftUI на плоскости на обнаруженном изображении.

Вот код, который у меня есть.

func renderer(_ renderer: SCNSceneRenderer, nodeFor anchor: ARAnchor) -> SCNNode? {

    // After detecting the image marker
    let node = SCNNode()

    guard let imageAnchor = anchor as? ARImageAnchor else { return nil }
    guard let imageName = imageAnchor.name else { return nil }
    let plane = SCNPlane(width: imageAnchor.referenceImage.physicalSize.width,
                         height: imageAnchor.referenceImage.physicalSize.height)

    let planeNode = SCNNode(geometry: plane)
    planeNode.eulerAngles.x = -.pi / 2
    arViewController = createARController(node: planeNode)
    node.addChildNode(planeNode)
    return node
}

func createARController(node: SCNNode) -> ARViewController {
    let arVC = UIStoryboard(name: "ARStoryboard", bundle: nil).instantiateInitialViewController() as! ARViewController

    DispatchQueue.main.async {

        arVC.planeNode = node
        arVC.willMove(toParent: self)
        self.addChild(arVC)
        arVC.view.frame = CGRect(x: 0, y: 0, width: 500, height: 500)
        self.view.addSubview(arVC.view)

    }
    self.show(viewController: arVC, on: node)
    return arVC
}



 private func show(viewController: ARViewController, on node: SCNNode) {
    let material = SCNMaterial()

    material.diffuse.contents = viewController.view
    node.geometry?.materials = [material]
    DispatchQueue.main.asyncAfter(deadline: .now() + .seconds(1)) {

        // add child vc with swiftui view here.
        viewController.addARView()
    }

}


class ARViewController: UIViewController {

var planeNode: SCNNode?

@IBOutlet weak var containerView: UIView!
override func viewDidLoad() {
    super.viewDidLoad()

    print("ARViewController loaded")
    // Do any additional setup after loading the view.
}

func addARView() {
    let controller = UIHostingController(rootView: SwiftUIARView())
    self.addChild(controller)
    controller.view.frame = self.view.frame
    view.addSubview(controller.view)
    controller.didMove(toParent: self)
}

}

Если у меня есть кнопка UIKit на ARViewController, я вижу кнопку, но когда вызывается функция addARView () для инициализации UIHostingController, тогда я просто вижу, как отображается черный вид. Фактическое представление никогда не отображается. Я делаю что-то неправильно? или сейчас это просто невозможно?

Кому-нибудь повезло в рендеринге SwiftUI Views в приложении ARKit SceneKit?

1 Ответ

0 голосов
/ 11 апреля 2020

Я решил, подробное описание написано на этой средней статье, которую я написал

https://medium.com/@sarangborude / как использовать swiftui-view-in-anarkit-scenekit-app- d6504d7b92d2

...