Search code examples
iosswiftaugmented-realityswift5scntext

How to add textview inside a node of sceneVIew in ARkit ios


I am new in AR development and currently working with one video calling based application using AR features so need to add UITextview inside sceneview's node

I have tried with following code:

  let scanInfo = UITextView(frame:CGRect(x: location.x, y: location.y, width: 100, height: 80))

    scanInfo.textAlignment = .left
    scanInfo.textColor = UIColor.white
    scanInfo.text = "SCAN A SURFACE"

  sceneView.addSubview(scanInfo)

If anyone having some idea about then plz let me know


Solution

  • Hey guys I got the solution of my own question Hope this helps.

    Add a plane node and inside that add SCNtext as a child node of plane node

    sceneView.automaticallyUpdatesLighting = true
    sceneView.autoenablesDefaultLighting = true
       
    guard let anchor = self.makeAnchor(at: location) else {return}
       
    let plane = SCNPlane(width: 50, height: 50)
    plane.materials.first?.diffuse.contents = UIColor.gray
        
    let planeNode = SCNNode(geometry: plane)
        
    planeNode.scale = SCNVector3(0.0015, 0.0015, 0.0015)
    planeNode.position = SCNVector3(anchor.transform.columns.3.x ,anchor.transform.columns.3.y,anchor.transform.columns.3.z)
        
    let yawn = sceneView.session.currentFrame?.camera.eulerAngles.y
        
    planeNode.eulerAngles.y = (yawn ?? 0) + .pi * 2
    planeNode.eulerAngles.x =(sceneView.session.currentFrame?.camera.eulerAngles.x ?? 0)
    lastnode = planeNode
    sceneView.scene.rootNode.addChildNode(planeNode)
    
    
      let text = SCNText(string: textSrting, extrusionDepth: 1)
        let material = SCNMaterial()
        material.diffuse.contents = UIColor.white
        material.multiply.intensity = 0.8
        material.specular.contents = UIColor.red
        material.isDoubleSided = true
    
        material.locksAmbientWithDiffuse = true
    
        let (min, max) = lastnode!.boundingBox
        let width = CGFloat(max.x - min.x)
        let height = CGFloat(max.y - min.y)
        text.containerFrame = CGRect(x: CGFloat(min.x + 2), y: CGFloat(min.y - 2), width: (width - 3) , height: (height + 2))
        text.truncationMode = CATextLayerTruncationMode.middle.rawValue
        text.isWrapped = true
        text.alignmentMode = CATextLayerAlignmentMode.left.rawValue
        text.truncationMode = CATextLayerTruncationMode.middle.rawValue
    
        text.font = UIFont(name: "Proxima-nova", size: 3)
        text.materials = [material]
        
        
        let textNode = SCNNode(geometry: text)
    
        lastnode?.addChildNode(textNode)