2017-07-11 19 views
9

私のiOSアプリケーション開発プロジェクトの1つで、ARSCNViewでビューをプッシュしようとするときはいつでも。アプリはここで私のコードです凍結されています。あなたが同じことを認識しているなら、適切な解決法を提案してください。シーンビューに新しいビューが表示されるときアプリケーションがフリーズされる

- >sceneViewコントローラ上のプッシュビューは

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

あなたはどのくらいですか?あなたが凍っているとき、あなたはどの機能を果たしていますか? –

+0

私は、SceneViewの上に他のビューをプッシュまたは表示しようとするといつでも。正常にアニメーション化されたプッシュビューとアプリ全体がフリーズすることを意味します。 – imjaydeep

+0

例外ブレークポイントを設定し、フリーズする行を表示します。 –

答えて

2

あなたは、いかなる理由でもARセッションを中断してはなりません。ポップオーバースクリーンでデザインを再構築してみてください。

あなたは本当に一時的にARで画面を非表示にする必要がある場合は、そこARSCNViewが消えたとき、ARCameraをフリーズiOSの11のベータ版のバグは、ですので:

  1. 絵コンテからARSCNViewを削除し、ビューコントローラからIBOutletを削除します。
  2. UIViewControllerが表示されたときにプログラムでARSCNViewを作成します。
  3. UIViewControllerが表示されなくなったときにARSCNViewを削除します。

短い例があります:あなたはそれを必要ともちろん

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() 
    } 
} 

は、あなたがシーンビューとセットアップARSCNViewARSessionSCNSceneのためのあなたのフレームを確認する必要があります。

Xcodeのベータ5

フリーズのほとんどはベータ5で修正されました。しかし、時には、それはまだあなたがネイティブの共有ビューコントローラを使用しているときのように、フリーズします。

-1

あなたがviewDidAppearのオーバーライド機能を持っており、()があなたのsetupSessionを開始すべきである私には思えるときのアプリのフリーズを取得。

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() 
} 
関連する問題