2017-07-11 42 views
9

iOS Uygulama geliştirme projemden birinde, ne zaman ARSCNView'a bir görünüm atmaya çalışıyorum. App aşağıda donuyor kodum. Aynı durumdan haberdarsanız lütfen uygun bir çözüm öneriniz.Sahne Görünümü Uygulaması Dondurulduğunda Yeni Görünüm Görüntülendiğinde

->sceneView denetleyicisi basmalı görünümü

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

Ne kadar kazanıyorsunuz? Donurken hangi fonksiyondasınız? SceneView'ın yukarısındaki diğer görünümleri itmeye veya sunmaya çalışıyorum her zaman –

+0

. push görünümünün başarılı ve tüm uygulamaların dondurulacağı anlamına gelir. – imjaydeep

+0

Bir istisna kesme noktası belirleyin ve bize hangi hattın dondurulduğunu gösterin. –

cevap

2

Sen herhangi nedenden dolayı AR oturumu kesme olmamalıdır. Tasarımınızı popover ekranlarıyla yeniden yapılandırmayı deneyin.

gerçekten geçici olarak AR ekrana gizlemeniz gerekiyorsa, var ARSCNView kaybolduğunda, ARCamera donuyor bir iOS 11 Beta böcek,, bu yüzden:

  1. Storyboard'dan ARSCNView çıkarın ve görünümü denetleyicisinden IBOutlet kaldırmak;
  2. , UIViewController görüntülendiğinde program aracılığıyla oluşturulur; UIViewController kaybolduğunda, ARSCNView'u kaldırın.

kısa bir örnek vardır: İhtiyaç olduğu Tabii

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

, sen sahne görünümü ve kurulum ARSCNView, ARSession ve SCNScene için çerçeveyi kontrol edilmelidir.

Xcode Beta 5

donuyor çoğu Beta 5. giderilmiştir Ama bazen hala yerli paylaşım görünümü denetleyicileri kullanırken gibi donar.

-1

Size viewDidAppear geçersiz kılma işlevi vardır ve() orada setupSession başlatmalıdır bana öyle geliyor olduğunda, uygulama dondu alma.

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