Как заставить UILabel появляться на экране, когда изображение не отслеживается, и исчезать, когда изображение отслеживается - PullRequest
0 голосов
/ 10 января 2019

Я создаю приложение для распознавания изображений, используя ARKit, где пользователь наведет камеру на несколько разных изображений в пространстве, и видео будет воспроизводиться поверх этих изображений. Я создал UILabel с сообщениями, чтобы предоставить инструкции пользователю. Когда пользователь впервые открывает приложение, я хочу показать ему сообщение с указанием указать камеру на изображение. Всякий раз, когда камера отслеживает изображение, я хочу, чтобы UILabel исчезла.

В моем коде я получил его там, где я могу сделать так, чтобы ярлык исчезал при отслеживании изображения, но я не могу заставить его снова появиться, когда я больше не отслеживаю изображение.

extension ViewController: ARSCNViewDelegate {
    func renderer(_ renderer: SCNSceneRenderer, nodeFor anchor: 
ARAnchor) -> SCNNode? {
        let node = SCNNode()

        //Show video overlayed to image
        if let imageAnchor = anchor as? ARImageAnchor{
            DispatchQueue.main.async { self.messageView?.isHidden = 
true }
            let plane = SCNPlane(width: 
imageAnchor.referenceImage.physicalSize.width, height: 
imageAnchor.referenceImage.physicalSize.height)

            //Create Plane
            switch imageAnchor.referenceImage.name!{
            case "slaveAuction":
                //Set AVPlayer as the planes texture and play
                plane.firstMaterial?.diffuse.contents = 
self.slaveAuction
                self.slaveAuction.play()
            case "columbus":
                plane.firstMaterial?.diffuse.contents = 
self.columbus
                self.columbus.play()
            case "isabellasCourt":
                plane.firstMaterial?.diffuse.contents = 
self.isabellasCourt
                self.isabellasCourt.play()
            case "hawksbell":
                plane.firstMaterial?.diffuse.contents = 
self.hawksbell
                self.hawksbell.play()
            default:
                print("Images not found")
            }

            let planeNode = SCNNode(geometry: plane)

            // Rotate the plane to match the anchor
            planeNode.eulerAngles.x = -.pi/2

            // Add plane node to parent
            node.addChildNode(planeNode)
        }

        return node
    }

}

Мне нужна помощь для отображения сообщения, когда я не отслеживаю изображение.

1 Ответ

0 голосов
/ 10 января 2019

Сделайте вашу переменную класса planeNode. И проверьте, виден ли ваш узел в каждом кадре.

func renderer(_ renderer: SCNSceneRenderer, updateAtTime time: TimeInterval) {
    if let pointOfView = sceneView.pointOfView, planeNode != nil {
        let isMaybeVisible = sceneView.isNode(planeNode, insideFrustumOf: pointOfView)
        DispatchQueue.main.async {
            if isMaybeVisible{
                self.messageView.isHidden = true
            }else{
                self.messageView.isHidden = false
            }
        }
    }
}

И посмотрите isNode (_: insideFrustumOf:)

...