如何使用ModalView推送ViewController?

时间:2018-10-17 11:34:17

标签: ios swift xcode navigation uikit

如何将显示模式视图( MV )的UIViewController( VC )推入一个带有从左到右过渡动画的屏幕上?

我尝试过:

  • 设置MV的模式过渡样式,然后将两个控制器都添加到导航控制器的viewControllers中。但是,这导致MV只是像堆栈中的其他任何控制器一样被淘汰的控制器。

  • 我尝试不使用动画从VC呈现MV,然后将VC添加到viewControllers并如上所述显示堆栈。这导致在开始向VC过渡时立即显示MV,而VC本身会按预期动画显示。例如。 MV滑入时不会跟随VC。

  • 我尝试过从启用了动画的VC中呈现MV,但这会导致两个过渡:首先是VC动画到屏幕,然后VC向上滑动。

我没有主意,但是我想要一个原生而干净的解决方案:当VC完全覆盖了MV时,如何通过一次正常的从左到右的推动过渡到VC?

关键是MV和VC一起动画; MV的外观和行为类似于全屏子视图,但是在关闭时,它会像其他任何模式视图控制器一样在屏幕外进行动画处理。

1 个答案:

答案 0 :(得分:0)

有许多解决此问题的方法。我认为UIPresentationController可以在这里提供重要线索。

我在这里尝试使答案尽可能简单。您可以根据需要更改参数,甚至可以更改UIPresentationController的子类来获得完整的动画。

         import UIKit


        //Green
        class TransViewController: UIViewController {

            // MARK: - Navigation


            override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
                // Get the new view controller using segue.destination.
                // Pass the selected object to the new view controller.
               let dest = segue.destination
               let nextVC = storyboard?.instantiateViewController(withIdentifier: "modelViewController")
                if let myPresenter = dest.presentationController{
                    myPresenter.presentedView!.addSubview(nextVC!.view)
                    nextVC!.view.center = CGPoint.init(x: nextVC!.view.center.x + nextVC!.view.frame.width , y: nextVC!.view.center.y)
                    UIView.animate(withDuration: 0.5, animations: {
                         nextVC!.view.center = self.view.center
                    }) { (success) in
                        dest.present(nextVC!, animated: false, completion: nil)
                    }
                }
            }
        }


        //Yellow  ; "modelViewController"

        class ModelViewController: UIViewController {
            @IBAction func click(_ sender : UIButton){
              self.dismiss(animated: true, completion: nil)
            }
        }

enter image description here