Добавлен пользовательский UIView в SCNNode, который не отображается должным образом - PullRequest
0 голосов
/ 06 февраля 2019

Я хочу добавить пользовательский UIView с одним UILabel в SCNNode (используя SceneKit и ARKit).

Я использовал SCNPlane с SCNMaterial, содержащим созданный слой UIView.Затем я запускаю новый SCNNode и добавляю его в сцену.Сначала я попробовал UIView, созданный в конструкторе интерфейсов, но это не работает.Поэтому я решил создать UIView программно.

class InfoPlaneNodeView: UIView {
    var elevationLabel: UILabel

    override init(frame: CGRect) {
        elevationLabel = UILabel(frame: frame)
        super.init(frame: frame)
        backgroundColor = UIColor.white
        layer.cornerRadius = 20

        elevationLabel.translatesAutoresizingMaskIntoConstraints = false
        elevationLabel.textColor = UIColor.black
        elevationLabel.text = "333m"
        addSubview(elevationLabel)

        elevationLabel.centerXAnchor.constraint(equalTo: centerXAnchor).isActive = true
        elevationLabel.centerYAnchor.constraint(equalTo: centerYAnchor).isActive = true
    }
}

class InfoViewPlaneNode: SCNNode {
    init(planeWidth: CGFloat, planeHeight: CGFloat) {
        let material = SCNMaterial()
        let infoPlaneNodeView = InfoPlaneNodeView(frame: CGRect(x: 0, y: 0, width: 200, height: 100))
        material.diffuse.contents = infoPlaneNodeView.layer
        material.transparency = 0.7
        material.lightingModel = .constant
        material.isDoubleSided = true

        let plane = SCNPlane(width: planeWidth, height: planeHeight)
        plane.materials = [material]
        super.init()
        self.geometry = plane
        self.position = SCNVector3(0, 3, 0)
    }
}

Когда я запускаю весь код, я вижу только белый UIView без UILabel.Я попробовал этот код без SceneKit и все работает отлично.Где проблема?Спасибо

https://imgur.com/a/rQmKJX6

1 Ответ

0 голосов
/ 06 февраля 2019

Однажды я столкнулся с этим делом.Поскольку представление не является частью какого-либо контроллера представления, вы должны нарисовать его вручную:

view.setNeedsDisplay()
view.displayIfNeeded()
...