在ARKit应用中显示SwiftUI视图

问题描述 投票:0回答:1

[我有一个应用程序,可以在其中检测图像并在检测到的图像上方的平面上显示UI。以前,我已经成功地在SceneKit ARKit应用程序的平面上显示UIViewController。我正在尝试在检测到的图像上的平面上显示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)
}

}

如果我在ARViewController上有一个UIKit按钮,则可以看到该按钮,但是当调用addARView()函数来初始化UIHostingController时,我只会看到呈现的黑色视图。实际视图永远不会被渲染。难道我做错了什么?还是暂时不可能?

有人在ARKit SceneKit应用中渲染SwiftUI视图有运气吗?

ios swift swiftui scenekit arkit
1个回答
0
投票
© www.soinside.com 2019 - 2024. All rights reserved.