2017-07-11 3 views
9

Dans l'un de mes projets de développement d'applications iOS, chaque fois que j'essaie d'afficher une vue sur ARSCNView. l'application gèle ici-bas est mon code. Veuillez suggérer une solution appropriée si vous en êtes conscient.Lorsque la nouvelle vue apparaît sur l'affichage de la scène L'application est figée

-> obtenir l'application figea lorsque la vue pression sur sceneView contrôleur

let session = ARSession() 
     var sessionConfig: ARSessionConfiguration = ARWorldTrackingSessionConfiguration() 
     var use3DOFTracking = false { 
      didSet { 
       if use3DOFTracking { 
        sessionConfig = ARSessionConfiguration() 
       } 
       sessionConfig.isLightEstimationEnabled = true 
       session.run(sessionConfig) 
      } 
     }  
    } 

override func viewDidLoad() { 
     super.viewDidLoad() 
     self.setupScene() 
     setupSession() 
} 

override func viewWillAppear(_ animated: Bool) { 
     self.tabBarController?.tabBar.isHidden = false 
     session.run(sessionConfig, options: [.resetTracking, .removeExistingAnchors]) 
    } 

override func viewDidDisappear(_ animated: Bool) { 
    super.viewWillDisappear(animated) 
    session.pause() 
} 


func setupScene() { 
     sceneView.delegate = self 
     sceneView.session = session 
     sceneView.antialiasingMode = .multisampling4X 
     sceneView.automaticallyUpdatesLighting = false 

     sceneView.preferredFramesPerSecond = 60 
     sceneView.contentScaleFactor = 1.3 
     //sceneView.showsStatistics = true 

     enableEnvironmentMapWithIntensity(25.0) 

     if let camera = sceneView.pointOfView?.camera { 
      camera.wantsHDR = true 
      camera.wantsExposureAdaptation = true 
      camera.exposureOffset = -1 
      camera.minimumExposure = -1 
     } 
    } 

    func setupSession() { 
     if let worldSessionConfig = sessionConfig as? ARWorldTrackingSessionConfiguration { 
      worldSessionConfig.planeDetection = .horizontal 
      session.run(worldSessionConfig, options: [.resetTracking, .removeExistingAnchors]) 
     } 
} 
+0

À quelle distance êtes-vous? Dans quelle fonction êtes-vous lorsque vous gèlez? –

+0

chaque fois que j'essaie de pousser ou de présenter une autre vue au-dessus de SceneView. signifie que la vue push animée avec succès et toute l'application va geler. – imjaydeep

+0

Définissez un point d'arrêt d'exception et montrez-nous sur quelle ligne vous vous arrêtez. –

Répondre

2

Vous ne devriez pas interrompre session AR pour une raison quelconque. Essayez de restructurer votre conception avec des écrans popover.

Il y a un bug bêta iOS 11, qui se fige ARCamera, quand disparaît ARSCNView, donc, si vous avez vraiment besoin d'écran masquer temporairement avec AR:

  1. Retirer ARSCNView de story-board et retirer IBOutlet du contrôleur de vue;
  2. Créer ARSCNView par programme, lorsque UIViewController apparaît;
  3. Supprimez ARSCNView lorsque UIViewController disparaît.

Il y a un court exemple:

class ViewController: UIViewController, ARSCNViewDelegate { 

    // Weak reference for scene view. 
    weak var sceneView: ARSCNView! 

    override func viewWillAppear(_ animated: Bool) { 
     super.viewWillAppear(animated) 
     // Create a new AR Scene View. 
     let sceneView = ARSCNView(frame: view.bounds) 
     sceneView.delegate = self 
     sceneView.showsStatistics = true 
     view.addSubview(sceneView) 
     // Create a new scene. 
     sceneView.scene = SCNScene(named: "art.scnassets/ship.scn")! 
     // Running session. 
     sceneView.session.run(ARWorldTrackingSessionConfiguration()) 
     // Saving weak reference. 
     self.sceneView = sceneView 
    } 

    override func viewWillDisappear(_ animated: Bool) { 
     super.viewWillDisappear(animated) 
     // Removing current SceneView to avoid freezes. 
     sceneView?.removeFromSuperview() 
    } 
} 

Bien sûr, vous devriez vérifier votre cadre pour une vue de la scène et la configuration ARSCNView, ARSession et SCNScene comme vous en avez besoin.

Xcode Beta 5

La plupart des gels a été corrigé dans la version bêta 5. Mais parfois, il gèle encore, comme lorsque vous utilisez les contrôleurs de vue de partage natif.

-1

Il me semble que vous devriez avoir une fonction prioritaire de viewDidAppear et de lancer votre setupSession() là-bas.

override func viewDidAppear(_ animated: Bool) { 
    super.viewDidAppear(animated) 

    // Prevent the screen from being dimmed after a while. 
    UIApplication.shared.isIdleTimerDisabled = true 

    // Start the ARSession. 
    setupSession() 
}