【问题标题】:When New View appears on Scene View App is Freezed当场景视图应用程序上出现新视图时被冻结
【发布时间】:2017-12-15 01:16:28
【问题描述】:

在我的一个 iOS 应用程序开发项目中,每当我尝试在 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])
        }
}

【问题讨论】:

  • 你能走多远?当你冻结时,你在哪个功能?
  • 每当我试图在 SceneView 上方推送或呈现其他视图时。意味着推送视图动画成功并且整个应用程序将被冻结。
  • 设置异常断点并向我们展示您冻结在哪一行。

标签: swift scenekit arkit


【解决方案1】:

不应因任何原因中断 AR 会话。尝试使用弹出屏幕重新构建您的设计。

iOS 11 Beta 存在一个错误,当 ARSCNView 消失时会冻结 ARCamera,因此,如果您确实需要使用 AR 暂时隐藏屏幕:

  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 Beta 5

大多数冻结已在 Beta 5 中得到修复。但有时仍会冻结,例如当您使用本机共享视图控制器时。

【讨论】:

    【解决方案2】:

    在我看来你应该有一个 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()
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-12-14
      • 2015-01-09
      • 1970-01-01
      相关资源
      最近更新 更多