如何仅将第二个视图控制器显示为模态但有动画过渡?

时间:2018-12-19 11:06:26

标签: swift xcode modal-dialog segue

在故事板中有三个控制器(FirstVC,SecondVC,ThirdVC),导航是顺序的:用户可以从FirstVC模态显示SecondVC。然后从SecondVC模态呈现ThirdVC。现在,我需要创建一些按钮,以从FirstVC打开ThirdVC,但也要在其间插入SecondVC,因此,当用户从ThirdVC向后按/交叉时,他将返回SecondVC。因此,我不需要从FirstVC到SecondVC的动画,只需要转到SecondVC,然后仅动画过渡到ThirdVC。

我对推式How to push two view controllers but animate transition only for the second one?发现了同样的问题。我需要与礼物模态相同。

2 个答案:

答案 0 :(得分:1)

在呈现当前视图控制器的视图之前,您无法呈现视图控制器。因此,不可能在第二个演示文稿起源于第一个演示文稿的同时同时显示两个视图控制器-第一个必须首先呈现其视图。

但是解决方案仍然很基本。如果用户从A转到B,则可以像平常一样从A呈现B。如果用户从A转到C,则可以从A呈现C,但是C是一个容器视图控制器,具有两个子代(B和C,C显然在顶部)。因此,当用户解雇C时,他实际上并没有解雇任何东西,而是将C动画出来以显示B(使用与解雇相同的动画)。对于用户来说,看起来都是一样的。

答案 1 :(得分:1)

这将是层次结构 第一个VC呈现第二个VC

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)

第二个VC将第三个VC添加为子视图并使其可见

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时,将其从带有动画的超级视图中删除并显示第二个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)