首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ARKit:如何将UIView添加到ARKit场景?

ARKit:如何将UIView添加到ARKit场景?
EN

Stack Overflow用户
提问于 2018-02-09 15:43:26
回答 3查看 6.6K关注 0票数 11

我正在做一个使用ARKit的AR项目。

我想在ARKit场景中添加一个UIView。当我点击一个对象时,我希望在该对象旁边以“弹出窗口”的形式获得信息。此信息位于UIView中。

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

还是有别的办法?

谢谢!

编辑: my SecondViewController的代码

代码语言:javascript
复制
class InformationViewController: UIViewController {

    @IBOutlet weak var secondView: UIView!

    override func viewDidLoad() {
        super.viewDidLoad()
        self.view = secondView
    }
}

编辑2: firstViewController中的代码

代码语言:javascript
复制
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)

我只能看到一架飞机的白色屏幕,而不是视图。

EN

回答 3

Stack Overflow用户

发布于 2018-02-10 02:39:13

要实现这一点,最简单的方法(虽然没有文档)是将视图控制器支持的UIView设置为SCNPlane上材质的漫反射内容(实际上是任何其他几何体,但由于显而易见的原因,它最适用于平面)。

代码语言:javascript
复制
let plane = SCNPlane()
plane.firstMaterial?.diffuse.contents = someViewController.view
let planeNode = SCNNode(geometry: plane)

你必须在某个地方持久化视图控制器,否则它将被释放,平面将不可见。只使用不带任何UIViewControllerUIView将抛出错误。

最好的一点是,它保留了所有的手势,实际上只是一个简单的视图。例如,如果你使用UITableViewController的视图,你将能够在场景中滚动它。

我还没有在iOS 10和更低版本上测试过它,但到目前为止它已经在iOS 11上工作过了。适用于普通SceneKit场景和ARKit。

票数 17
EN

Stack Overflow用户

发布于 2018-02-09 16:29:13

我现在不能提供你的代码,但这是如何做到这一点。

使用所需的所有元素创建一个SCNPlane.

  • Create

  • UIView

  • UIView.

  • Use创建图像上下文作为SCNPlane.

的材料

或者更容易制作带有标签的SKScene,并将其添加为SCNPlane的材料。

票数 2
EN

Stack Overflow用户

发布于 2018-02-09 16:30:04

要在标签中放置文本,您可以将其绘制为图像,然后将该图像附加到SCNNode

例如:

代码语言:javascript
复制
let text = "Hello, Stack Overflow."
let font = UIFont(name: "Arial", size: CGFloat(size))
let width = 128
let height = 128

let fontAttrs: [NSAttributedStringKey: Any] = 
[NSAttributedStringKey.font: font as UIFont]

let stringSize = self.text.size(withAttributes: fontAttrs)
let rect = CGRect(x: CGFloat((width / 2.0) - (stringSize.width/2.0)),
                  y: CGFloat((height / 2.0) - (stringSize.height/2.0)),
                  width: CGFloat(stringSize.width),
                  height: CGFloat(stringSize.height))

let renderer = UIGraphicsImageRenderer(size: CGSize(width: CGFloat(width), height: CGFloat(height)))
let image = renderer.image { context in

    let color = UIColor.blue.withAlphaComponent(CGFloat(0.5))

    color.setFill()
    context.fill(rect)

    text.draw(with: rect, options: .usesLineFragmentOrigin, attributes: fontAttrs, context: nil)
}

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

let node = SCNNode(geometry: plane)

编辑:我添加了以下几行:

代码语言:javascript
复制
let color = UIColor.blue.withAlphaComponent(CGFloat(0.5))

color.setFill()
context.fill(rect)

这使您可以设置背景色和不透明度。还有其他方法可以做到这一点-也可以让你绘制复杂的形状-但这是最简单的基本颜色。

编辑2:添加了对stringSizerect的引用

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48700939

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档