Быстрое отображение пользовательских переходов перед фиксацией - PullRequest
0 голосов
/ 08 января 2019

У меня есть два контроллера представления, A и B. Я могу перейти от A к B через переход, и я реализовал анимацию постепенного изменения в переходе, реализовав класс UISegue. Однако проблемы возникают во время вращения устройства и раскручивания (от B до A, когда вращение произошло, пока в B).

Проблема заключается в том, что представление для представления (представление A) имеет неправильный макет. Вызов функций, таких как setNeedsUpdateConstraints() или layoutSubviews() или аналогичных функций до того, как переходы не работают. Снимок экрана описывает ситуацию, когда A открывается в альбомной ориентации, а затем выполняется переход к B. В положении B устройство поворачивается обратно в портретное положение и разматывается в A.

Код Swift для segues:

class SegueFadeOut: UIStoryboardSegue {

    override func perform() {
        UIView.transition(from: source.view, to: destination.view, duration: 5.5, options: [.transitionCrossDissolve]) { (success) in
            self.destination.dismiss(animated: false, completion: nil)
        }
    }

}

class SegueFadeIn: UIStoryboardSegue {

    override func perform() {
        let toViewController = self.destination
        let fromViewController = self.source

        let containerView = fromViewController.view.superview

        toViewController.view.alpha = 0.0
        containerView?.addSubview(toViewController.view)

        UIView.animate(withDuration: 0.5, delay: 0, options: .curveEaseInOut, animations: {
            toViewController.view.alpha = 1.0
        }, completion: { success in
            fromViewController.present(toViewController, animated: false, completion: nil)
        })
    }

}

Есть какие-нибудь подсказки о том, как или где реализовать функцию, которая исправит эту проблему с макетом? Спасибо!

The transition during performance

1 Ответ

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

Мне удалось это исправить. Я могу установить кадр прямо перед выполнением анимации. Я также прекратил использовать функцию UIView.transition(...), так как она выдавала некоторые ошибки при удалении из ViewView Controller.

class SegueFadeOut: UIStoryboardSegue {

    override func perform() {
        let toViewController = self.destination
        let fromViewController = self.source

        let containerView = fromViewController.view.superview

        toViewController.view.alpha = 0.0
        // ADDED LINE BELOW
        toViewController.view.frame = fromViewController.view.frame

        containerView?.addSubview(toViewController.view)

        UIView.animate(withDuration: 0.5, delay: 0, options: .curveEaseInOut, animations: {
            toViewController.view.alpha = 1.0
        }, completion: { success in
            fromViewController.dismiss(animated: false, completion: nil)
        })
    }

}
...