Как показать два контроллера вида как модальный, но анимированный переход только для второго? - PullRequest
0 голосов
/ 19 декабря 2018

У меня есть три контроллера (FirstVC, SecondVC, ThirdVC) внутри storyboad, и навигация осуществляется последовательно: пользователь может представить модально SecondVC из FirstVC.а затем представить модально ThirdVC от SecondVC.Теперь мне нужно сделать какую-нибудь кнопку, которая откроет ThirdVC из FirstVC, но также включит SecondVC между ними, поэтому, когда пользователь нажмет назад / Cross из ThirdVC, он будет возвращен в SecondVC.Итак, мне не нужна анимация от FirstVC до SecondVC, просто нужно перейти на SecondVC и затем анимировать только переход на ThirdVC.

Я нашел такой же вопрос для push sague Как выдвинуть два контроллера представления, но анимироватьпереход только на второй? .Мне нужно такое же поведение с настоящим модально.

Ответы [ 2 ]

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

Здесь будет иерархия, в которой первый виртуальный виртуальный канал представляет второй виртуальный виртуальный канал

let vc = UIStoryboard.init(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "SecondVC") as! SecondVC
    present(vc, animated: true, completion: nil)
present(vc, animated: true, completion: nil)

второй виртуальный виртуальный канал добавит третий виртуальный виртуальный канал в качестве подпредставления и сделает его видимым

override func viewDidLoad() {
    super.viewDidLoad()

    // Do any additional setup after loading the view.

    let vc = UIStoryboard.init(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "ThirdVC") as! ThirdVC
    self.addChild(vc)
    self.view.addSubview(vc.view)
}

при отклонении третьего виртуального контейнера удаляет егосупер просмотр с анимацией и показ второго VC

UIView.animate(withDuration: 0.5, animations: { [weak self] in
        self?.view.frame = CGRect(x: 0, y: self?.view.frame.height ?? 0.0, width: self?.view.frame.width ?? 0.0, height: self?.view.frame.height ?? 0.0)
    }, completion: { [weak self] _ in
        self?.view.removeFromSuperview()
    })

отклонение второго VC и показ первого VC

dismiss(animated: true, completion: nil)
0 голосов
/ 19 декабря 2018

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

Но решение по-прежнему довольно простое.Если пользователь переходит от A к B, вы представляете B из A, как обычно.Если пользователь переходит от A к C, вы представляете C из A, но C является контроллером представления контейнера с двумя дочерними элементами (B и C, C, очевидно, сверху).Поэтому, когда пользователь отклоняет C, он на самом деле ничего не отклоняет, а скорее анимирует C вне поля зрения, чтобы показать B (используя ту же анимацию, что и при отклонении).Для пользователя все выглядит одинаково.

...