ARKit:如何在ARKit场景中添加UIView?

Inf*_*ics 9 iphone uiview ios swift arkit

我正在使用ARKit开展AR项目.

我想在ARKit场景中添加一个UIView.当我点击一个对象时,我希望将信息作为对象旁边的"弹出窗口".这些信息在UIView中.

是否可以将此UIView添加到ARKit场景?我将这个UIView设置为场景,然后我该怎么办?我可以给它一个节点然后将它添加到ARKit场景吗?如果是这样,它是如何工作的?

或者还有另一种方式吗?

谢谢!

编辑:我的SecondViewController的代码

class InformationViewController: UIViewController {

    @IBOutlet weak var secondView: UIView!

    override func viewDidLoad() {
        super.viewDidLoad()
        self.view = secondView
    }
}
Run Code Online (Sandbox Code Playgroud)

编辑2:firstViewController中的代码

guard let secondViewController = storyboard?.instantiateViewController(withIdentifier: "SecondViewController") as? SecondViewController else {
    print ("No secondController")
    return
}

let plane = SCNPlane(width: CGFloat(0.1), height: CGFloat(0.1))       
plane.firstMaterial?.diffuse.contents = secondViewController.view

let node = SCNNode(geometry: plane)
Run Code Online (Sandbox Code Playgroud)

我只得到一架飞机的白色屏幕,而不是视线.

Lës*_*ski 16

实现这一目标的最简单(尽管未记录)方法是将UIView视图控制器支持为SCNPlane(或任何其他几何体上的材质的漫反射内容),但出于显而易见的原因,它最适合于平面.

let plane = SCNPlane()
plane.firstMaterial?.diffuse.contents = someViewController.view
let planeNode = SCNNode(geometry: plane)
Run Code Online (Sandbox Code Playgroud)

您将不得不将视图控制器保留在某处,否则它将被释放并且平面将不可见.只使用一个UIView没有任何UIViewController将抛出错误.

关于它的最好的事情是它保持所有的手势,实际上只是作为一个简单的视图.例如,如果使用UITableViewController视图,则可以在场景内向右滚动.

我还没有在iOS 10及更低版本上测试它,但到目前为止它一直在iOS 11上运行.在普通的SceneKit场景和ARKit中都可以使用.

  • 这对我有用!非常感谢!顺便说一句,我还有一个问题,就是只能看到一个白色的平面,但这是因为我没有在任何地方存储对视图控制器的引用。我在主视图控制器中声明了一个变量,以保留对辅助视图控制器的引用,现在它可以工作,甚至可以滚动(我使用表视图控制器来测试交互)。 (2认同)

Alo*_*edi 2

我现在无法为您提供代码,但这是如何做到的。

  1. 创建一个SCNPlane
  2. UIView使用您需要的所有元素创建您的。
  3. 从创建图像上下文UIView
  4. 使用此图像作为 的材料SCNPlane

或者甚至更容易使用SKScene标签制作并将其添加为 的材料SCNPlane

示例:/sf/answers/5206639161/