Я пытаюсь создать меню с 4 различными уровнями, где каждый уровень представляет собой UIViewController
.Я хочу, чтобы меню и каждый из его уровней были представлены модально.В настоящее время я делаю это, позволяя базовому ViewController (VC) представить еще один, который, в свою очередь, представляет 3-й, который представляет 4-й (структура будет ABCD, где каждый -
представляет вызов UIViewController.present(_:animated:completion:)
для соответствующего уровня).
Затем я реализую UIViewControllerTransitioningDelegate
и снабжаю его настраиваемым объектом перехода.Это хорошо работает для первых 3-х уровней (т.е. меню работает, как и ожидалось для уровня ABC), но когда я нахожусь на 4-м уровне и пытаюсь отклонить его (т. Е. Переходя от ABCD к ABC), уровень B краткоотображается вместо уровня C. во время воспроизведения анимации.После завершения анимации уровень C снова всплывает над B.
Я подозреваю, что проблема заключается в том, чтобы как-то представить более 3 виртуальных каналов в иерархии, но этого не происходит, если вместо этого используется анимация отклонения по умолчаниюиз пользовательского, который я использую.
Может быть, я должен пойти на другой подход к навигации, или есть какой-то способ обойти это поведение?Мне нужно, чтобы меню было «модальным», что, насколько я могу судить, помешало бы мне использовать UINavigationController
(мне не нужны навигационные панели).
Помощь очень важна.
--- EDIT ---
Вот пример «псевдокода» того, чего я пытаюсь достичь, так как проект довольно большой, и у меня будут проблемы с его вставкой:
class A: UIViewController: UIViewControllerTransitioningDelegate {
func viewDidLoad(){...}
.
.
.
@objc func presentB(){
self.present(B, animated: true, completion: nil)
}
func animationController(forPresented presented: UIViewController, presenting: UIViewController, source: UIViewController) -> UIViewControllerAnimatedTransitioning? {
return CustomTransition(presenting: true)
}
func animationController(forDismissed dismissed: UIViewController) -> UIViewControllerAnimatedTransitioning? {
return CustomTransition(presenting: false)
}
}
class B: UIViewController: UIViewControllerTransitioningDelegate {
func viewDidLoad(){...}
.
.
.
@objc func dismiss(){
self.dismiss(animated: true, completion: nil)
}
@objc func presentC(){
self.present(C, animated: true, completion: nil)
}
func animationController(forPresented:presenting:source:) -> UIViewControllerAnimatedTransitioning? { ... }
func animationController(forDismissed:) -> UIViewControllerAnimatedTransitioning? {...}
}
class C: UIViewController: UIViewControllerTransitioningDelegate {
func viewDidLoad(){...}
.
.
.
@objc func dismiss(){
self.dismiss(animated: true, completion: nil)
}
@objc func presentD(){
self.present(D, animated: true, completion: nil)
}
func animationController(forPresented:presenting:source:) -> UIViewControllerAnimatedTransitioning? { ... }
func animationController(forDismissed:) -> UIViewControllerAnimatedTransitioning? {...}
}
class D: UIViewController {
func viewDidLoad(){...}
.
.
.
@objc func dismiss(){
self.dismiss(animated: true, completion: nil)
}
}