动画根视图控制器过渡

时间:2018-07-27 01:52:57

标签: ios swift xcode uiviewcontroller uistoryboardsegue

我想为一个根视图控制器和另一个根视图控制器之间的过渡设置动画。假设我可以对另一个视图控制器执行切换,而不是切换根目录,但是如果可能的话,我想保持根视图控制器的过渡。这是我在没有动画的情况下必须执行的操作。

let initialViewController = UIStoryboard.initialViewController(for: .main)
self.view.window?.rootViewController = initialViewController
self.view.window?.makeKeyAndVisible()

我该如何处理一个动画,其中第一个控制器向上滑动并露出第二个控制器?

2 个答案:

答案 0 :(得分:0)

您真的不应该更改根视图控制器。

因此,我处理此问题的方式是我的根视图控制器不是我的根视图控制器。相反,我有一个“秘密”的根视图控制器,它是 real 根视图控制器。它实际上什么也没做。其视图不包含任何接口。它唯一的工作是充当其他所有“根”视图控制器的父级。它是一个自定义的父视图控制器(容器视图控制器),并且始终有一个子视图控制器。

片刻的想法表明,现在解决了该问题,因为用另一个子视图控制器及其视图替换子视图控制器及其视图的业务非常简单,而且文档齐全,同时在视图之间进行动画转换

答案 1 :(得分:0)

一种方法可能是:
1.将2nd ViewController设置为根视图控制器。
2.将1st ViewController的视图添加到2nd Controller。
3.删除带有动画的第一个控制器的视图。

代码:

class View2Controller: UIViewController {

    var viewToAnimate:UIView?

    override func viewDidLoad() {
        super.viewDidLoad()

        // Do any additional setup after loading the view.

        if let view1Controller = self.storyboard?.instantiateViewController(withIdentifier: "View1Controller") {
            self.addChildViewController(view1Controller)
            self.view.addSubview(view1Controller.view)
            self.viewToAnimate = view1Controller.view
        }

        DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + 1.5) {
            let frame = self.view.frame
            UIView.animate(withDuration: 1.0, animations: {
                self.viewToAnimate?.frame = CGRect(x: 0, y: -frame.height, width: frame.width, height: frame.height)
            }, completion: { (finished) in
                if finished {
                    self.viewToAnimate?.removeFromSuperview()
                }
            })
        }
    }

    override func viewDidLayoutSubviews() {
        super.viewDidLayoutSubviews()

        self.viewToAnimate?.frame = self.view.bounds
    }
}

效果:
enter image description here

Github上的源代码:
SlideUp Demo