Камера зависает, когда я возвращаюсь к контроллеру представления, содержащему ARSCNView.Как прийти и уйти в этом контроллере представления без ARSCNView перестать работать? - PullRequest
0 голосов
/ 29 января 2019

Как я инициализирую ARSCNView

var sceneView: ARSCNView?

override func viewDidLoad() {
    super.viewDidLoad()
    if ARConfiguration.isSupported{
        sceneView = ARSCNView(frame: CGRect(x: 0, y: 0, width: UIScreen.main.bounds.size.width, height: UIScreen.main.bounds.size.height))

        view.addSubview(sceneView!)

        sceneView!.delegate = self
        // Show statistics such as fps and timing information
        sceneView!.showsStatistics = false

        // Create a new scene
        let scene = SCNScene(named: "totens.scnassets/Main.scn")!
        // Set the scene to the view
        sceneView!.scene = scene
     }
  }

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

        guard let referenceImages = ARReferenceImage.referenceImages(inGroupNamed: "TotensImages", bundle: nil) else { return }

        let configuration = ARImageTrackingConfiguration()
        configuration.trackingImages = referenceImages
        let options: ARSession.RunOptions = [.removeExistingAnchors]

        sceneView!.session.run(configuration, options: options)
 }

При закрытии этого контроллера просмотра и попытке перезапустить сеанс перестает появляться камера.Кто-то знает, как мне помочь с этим?спасибо

1 Ответ

0 голосов
/ 29 января 2019

Хорошо, это не лучший способ исправить это, но, вероятно, это сработает.

В ViewController, где у вас есть ARScene View, вы должны инициализировать флаг bool, который проверит, нужно ли запускать конфигурацию.итак ..

var shouldDoThingsInViewWillAppear: Bool = true
    override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
if shouldDoThingsInViewWillAppear {
shouldDoThingsInViewWillAppear = false
        guard let referenceImages = ARReferenceImage.referenceImages(inGroupNamed: "TotensImages", bundle: nil) else { return }

        let configuration = ARImageTrackingConfiguration()
        configuration.trackingImages = referenceImages
        let options: ARSession.RunOptions = [.removeExistingAnchors]

        sceneView!.session.run(configuration, options: options)
    }

 }

Если эта работа означает, что вы не должны запускать дважды сеанс или что вы не должны добавлять дважды изображения отслеживания.

Если не пытаетесь выполнитьТо же самое, что и viewDidAppear вместо ViewWillAppear.

Если вы попытаетесь изменить метод запуска на

sceneView.session.run(configuration, options: [.resetTracking, .removeExistingAnchors])
...