Переход к новому ViewController, встроенному в UINavigationController, вызывает проблемы с анимацией - PullRequest
0 голосов
/ 27 декабря 2018

Я использую rootViewController и хочу перейти к другому ViewController.Переход к newViewController работает с этим кодом.

Проблема возникает, когда newViewController встроен в UINavigationController.Затем навигационная панель анимируется во время анимации и меняет положение.

Навигационная панель анимируется от верхнего левого угла до правильного положения.

fileprivate func animateTransition(to newViewController: UIViewController) {
    currentViewController.willMove(toParent: nil)
    addChild(newViewController)
    newViewController.view.frame = view.bounds
    transition(from: currentViewController, to: newViewController, duration: 2, options: [.transitionCrossDissolve, .curveEaseOut], animations: {
        self.currentViewController.removeFromParent()
        newViewController.didMove(toParent: self)
        self.currentViewController = newViewController
    }, completion: nil)
}

Как можно перейти кеще один UINavigationController с анимацией «затухания» и как навигационная панель может находиться в правильном положении с самого начала анимации?

Ответы [ 2 ]

0 голосов
/ 27 декабря 2018

Во-первых, вы должны переместить вызов кода очистки контроллера представления из замыкания animations в замыкание completion:

currentViewController.willMove(toParent: nil)
addChild(newViewController)
newViewController.view.frame = view.bounds
transition(from: currentViewController, to: newViewController, duration: 2, options: [.transitionCrossDissolve, .curveEaseOut], animations: {
    // this is intentionally blank
}, completion: { _ in
    self.currentViewController.removeFromParent()
    newViewController.didMove(toParent: self)
    self.currentViewController = newViewController
})

Вы не хотите указывать, что переход выполнен доанимация завершена.

Что касается проблемы с панелью навигации, вместо того, чтобы transition(from:to:duration:...) обрабатывать манипуляции с иерархией контроллера представления, вы можете добавить ее в иерархию представлений и затем анимировать ее отображение.Обычно вы используете опцию .showHideTransitionViews, но transition все еще делает что-то любопытное с методами внешнего вида, которые сбивают с толку навигационный контроллер, поэтому лучше просто анимировать его самостоятельно:

currentViewController.willMove(toParent: nil)
addChild(newViewController)
newViewController.view.frame = view.bounds
newViewController.view.alpha = 0
view.addSubview(newViewController.view)
UIView.animate(withDuration: 2, delay: 0, options: .curveEaseOut, animations: {
    newViewController.view.alpha = 1
}, completion: { _ in
    self.currentViewController.view.removeFromSuperview()
    self.currentViewController.removeFromParent()
    newViewController.didMove(toParent: self)
    self.currentViewController = newViewController
})

Этопозволит ему правильно представить навигационную панель с самого начала и просто добавить ее.

0 голосов
/ 27 декабря 2018

попробуйте поместить это под объявлением класса newViewController

override func viewDidLoad() {
    super.viewDidLoad()
    self.navigationController?.setNavigationBarHidden(false, animated: false)
}

, если у вас уже есть viewDidLoad () в вашем ViewController, тогда просто используйте последнюю часть.

Если это не такне работай, дай мне знать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...