【发布时间】:2018-05-04 12:25:11
【问题描述】:
我正在以编程方式生成一组UILabels,将它们附加到SCNNodes,然后将它们放置在一个场景中。
问题是某些标签上的文字没有出现。这(似乎)随机发生。
代码如下:
var labels = [SCNNode]()
var index: Int
var x: Float
var y: Float
let N = 3
for i in 0 ... N-1 {
for k in 0 ... N-1 {
let node = label()
labels.append(node)
index = labels.count - 1
x = Float(i) * 0.5 - 0.5
y = Float(k) * 0.5 - 0.5
sceneView.scene.rootNode.addChildNode(labels[index])
labels[index].position = SCNVector3Make(x, y, -1)
}
}
以及创建标签节点的方法:
func label() -> SCNNode {
let node = SCNNode()
let label = UILabel(frame: CGRect(x: CGFloat(0), y: CGFloat(0),
width: CGFloat(100), height: CGFloat(50)))
let plane = SCNPlane(width: 0.2, height: 0.1)
label.text = "test"
label.adjustsFontSizeToFitWidth = true
plane.firstMaterial?.diffuse.contents = label
node.geometry = plane
return node
}
标签本身总是正确显示,只是其中一些是空白的,没有文字。
我尝试过调整标签的大小、它所附着的平面大小、字体大小等 - 似乎没有任何效果。
我也尝试将标签创建包含在 DispatchQueue.main.async { ... } 中,但这也没有帮助。
我对 Swift 和 iOS 还比较陌生,所以很容易漏掉一些非常明显的东西。
提前致谢!
编辑:
(1) 设置label.backgroundColor = UIColor.magenta 可以清楚地表明实际上标签并没有被创建,但节点/平面是。
一些标签是白色的(即只有SCNNode被渲染),但是在短暂的延迟之后,它们有时会变成洋红色并且文本会出现。但有些标签仍会丢失。
(2) 进一步看来,它与节点(标签)相对于相机的位置和方向有关。我创建了一个大的(10x10)标签网格,然后测试将相机放置在网格中的不同初始位置。节点出现的可能性似乎与节点与初始相机位置的距离直接相关。直接在相机前面的那些节点总是被渲染,而那些远离的几乎从来没有。
(3) 解决方法/hack 是将标签转换为图像,然后使用它们 - 如果有人感兴趣,代码位于 https://github.com/Jordan-Campbell/uiimage-arkit-testing。
【问题讨论】:
-
您是否检查过您没有尝试将两个节点放在同一位置?我有一个类似的问题,其中一些出现而另一些没有出现,正是因为如此。
-
可能导致此问题的另一件事是,它可能会在呈现标签之前将标签从内存中丢失,如果您查看 Apple 文档,他们建议您的对象不要在函数内部声明,而是在一个类的记忆周期。
-
嗨,是的,在 AR 中渲染标签并不是很好——其中很多实际上取决于标签在渲染时相对于相机的角度。我发现最好的办法是将内容绘制到
UIImage,然后将其附加到SCNPlane。