ios ARKit:我如何添加一个UIView到ARKit场景?

iyfjxgzm  于 2022-11-19  发布在  iOS
关注(0)|答案(3)|浏览(154)

我正在使用ARKit进行一个AR项目。
我想在ARKit场景中添加一个UIView。当我点击一个对象时,我想在对象旁边以“弹出窗口”的形式获得信息。这些信息在UIView中。
是否可以将此UIView添加到ARKit Scene?我将此UIView设置为一个场景,然后我可以做什么?我可以给予它一个节点,然后将其添加到ARKit Scene吗?如果可以,它是如何工作的?
还是有别的办法?
谢谢你,谢谢你
编辑:我的SecondViewController的代码

class InformationViewController: UIViewController {

    @IBOutlet weak var secondView: UIView!

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

编辑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)

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

iqjalb3h

iqjalb3h1#

要 将 文本 放置 在 世界 中 的 标签 中 , 您 需要 将 其 绘制 到 图像 中 , 然后 将 该 图像 附加 到 SCNNode
例如 :

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)

中 的 每 一 个
编辑 : 我 添加 了 以下 行 :

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

color.setFill()
context.fill(rect)

格式
这 可以 让 你 设置 背景 颜色 和 不 透明度 。 还有 其他 的 方法 可以 做 这个 - - 也 可以 让 你 画 复杂 的 形状 - - 但是 这 是 最 简单 的 基本 颜色 。
编辑 2 : 添加 了 对 stringSizerect 的 引用

cu6pst1q

cu6pst1q2#

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

let plane = SCNPlane()
plane.firstMaterial?.diffuse.contents = someViewController.view
let planeNode = SCNNode(geometry: plane)

你必须将视图控制器保存在某个地方,否则它将被释放,平面将不可见。只使用UIView而不使用任何UIViewController将引发错误。
它最好的地方是保留了所有的手势,实际上就像一个简单的视图一样工作。例如,如果你使用UITableViewController的视图,你将能够在场景中滚动它。
我还没有在iOS10和更低版本上测试过它,但到目前为止它已经在iOS11上工作了。

bq8i3lrv

bq8i3lrv3#

我现在不能提供你的代码,但这是如何做到这一点。
1.创建一个SCNPlane
1.使用您需要的所有元素创建UIView
1.从UIView创建映像上下文。
1.使用此图像作为SCNPlane的材质。
或者更容易使SKScene与标签和添加它作为SCNPlane的材料。
示例:https://stackoverflow.com/a/74380559/294884

相关问题