我正在做一个使用ARKit的AR项目。
我想在ARKit场景中添加一个UIView。当我点击一个对象时,我希望在该对象旁边以“弹出窗口”的形式获得信息。此信息位于UIView中。
是否可以将此UIView添加到ARKit场景中?我将这个UIView设置为场景,然后我能做什么呢?我可以给它一个节点,然后将它添加到ARKit场景中吗?如果是这样,它是如何工作的?
还是有别的办法?
谢谢!
编辑: my 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)我只能看到一架飞机的白色屏幕,而不是视图。
发布于 2018-02-10 02:39:13
要实现这一点,最简单的方法(虽然没有文档)是将视图控制器支持的UIView设置为SCNPlane上材质的漫反射内容(实际上是任何其他几何体,但由于显而易见的原因,它最适用于平面)。
let plane = SCNPlane()
plane.firstMaterial?.diffuse.contents = someViewController.view
let planeNode = SCNNode(geometry: plane)你必须在某个地方持久化视图控制器,否则它将被释放,平面将不可见。只使用不带任何UIViewController的UIView将抛出错误。
最好的一点是,它保留了所有的手势,实际上只是一个简单的视图。例如,如果你使用UITableViewController的视图,你将能够在场景中滚动它。
我还没有在iOS 10和更低版本上测试过它,但到目前为止它已经在iOS 11上工作过了。适用于普通SceneKit场景和ARKit。
发布于 2018-02-09 16:29:13
我现在不能提供你的代码,但这是如何做到这一点。
使用所需的所有元素创建一个SCNPlane.
UIView。
UIView.
SCNPlane.的材料
或者更容易制作带有标签的SKScene,并将其添加为SCNPlane的材料。
发布于 2018-02-09 16:30:04
要在标签中放置文本,您可以将其绘制为图像,然后将该图像附加到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:添加了对stringSize和rect的引用
https://stackoverflow.com/questions/48700939
复制相似问题