代码之家  ›  专栏  ›  技术社区  ›  Ben Botvinick

设置根视图控制器转换的动画

  •  1
  • Ben Botvinick  · 技术社区  · 7 年前

    我想为一个根视图控制器和另一个根视图控制器之间的转换设置动画。我可以假设执行到另一个视图控制器的转换,而不是切换根,但如果可能,我希望保持根视图控制器转换。下面是我在没有动画的情况下要做的。

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

    比如说,在第一个控制器向上滑动并显示第二个控制器的动画中,我该如何做到这一点?

    2 回复  |  直到 7 年前
        1
  •  1
  •   Yun CHEN    7 年前

    一种方法可以是:
    1.将第二视图控制器设置为根视图控制器。
    2.将第一个ViewController的视图添加到第二个控制器。
    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

        2
  •  0
  •   matt    7 年前

    你真的不应该改变你的根视图控制器。

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

    稍作思考就会发现,现在问题已经解决了,因为用另一个子视图控制器及其视图替换子视图控制器及其视图,同时在视图之间通过动画进行转换,这是一项简单且有充分证明的工作。

    推荐文章