Пожарная передача на устройстве поворачивается от портрета к ландшафту - PullRequest
0 голосов
/ 30 августа 2018

Когда пользователь поворачивает устройство в ViewA от портрета до пейзажа, я представляю ViewB. Когда ViewB поворачивается назад к портрету, я представляю (отказываясь назад) ViewA. ViewA представляет детали, в то время как переход к ViewB представляет диаграмму. Вот мой код:

ViewA

override func viewWillAppear(_ animated: Bool)
    {
        UIDevice.current.beginGeneratingDeviceOrientationNotifications()
        NotificationCenter.default.addObserver(self, selector: #selector(ViewA.segueToLandscapeGraph), name: NSNotification.Name.UIDeviceOrientationDidChange, object: nil)
    }

    @objc func segueToLandscapeGraph()
    {
        let deviceOrientation = UIDevice.current.orientation
            print("fired! From ViewA")
        if UIDeviceOrientationIsLandscape(deviceOrientation){
            self.performSegue(withIdentifier: "graphLandscapeSegue", sender: self)
        }
    }

ViewB

override func viewWillAppear(_ animated: Bool)
    {
        UIDevice.current.beginGeneratingDeviceOrientationNotifications()

        NotificationCenter.default.addObserver(self, selector: #selector(ViewB.cancelOutOfLandscapeToPortrait), name: NSNotification.Name.UIDeviceOrientationDidChange, object: nil)
    }

    @objc func cancelOutOfLandscapeToPortrait()
    {
        let deviceOrientation = UIDevice.current.orientation
        print("fired! From ViewB")
        if UIDeviceOrientationIsPortrait(deviceOrientation){
            dismiss(animated: true, completion: nil)
        }
    }
    @IBAction func cancelOutOfSegue(_ sender: Any)
    {
        //This button is a failsafe for when app is stuck on this view
        dismiss(animated: true, completion: nil)
    }

Это прекрасно работает для первых двух вращений. Затем он застревает в ViewB, независимо от того, в каком направлении я его поворачиваю. У меня есть кнопка повышенной безопасности, чтобы выйти из ViewB обратно в ViewA для этого.

В отладчике я вижу много: если мы находимся в реальном обработчике предварительной фиксации, мы не можем добавить какие-либо новые заборы из-за ограничения CA

и

Попытка представить ViewB.GraphLabelDetailinLandscape: 0x7fa893450360 в> MyApp.ViewA: 0x7fa893851000, чье представление не находится в иерархии окон!

...