如何将两个视图控制器显示为模态但仅对第二个进行动画转换?
Posted
技术标签:
【中文标题】如何将两个视图控制器显示为模态但仅对第二个进行动画转换?【英文标题】:How to show two view controllers as modal but animate transition only for the second one? 【发布时间】:2018-12-19 11:06:25 【问题描述】:我在情节提要中有三个控制器(FirstVC、SecondVC、ThirdVC),并且导航是顺序的:用户可以从 FirstVC 模态地呈现 SecondVC。然后从 SecondVC 模态地呈现 ThirdVC。现在,我需要制作一些按钮,可以从 FirstVC 打开 ThirdVC,但也会在其间打开 SecondVC,所以当用户从 ThirdVC 按下返回/交叉时,他将返回到 SecondVC。所以,我不需要从 FirstVC 到 SecondVC 的动画,只需要转到 SecondVC 然后动画只过渡到 ThirdVC。
我对 push sague How to push two view controllers but animate transition only for the second one? 发现了同样的问题。我需要与当前模态相同的行为。
【问题讨论】:
用动画假呈现第二个,在完成处理程序中用动画呈现第三个? 它可以正常工作,但在瞬间,SecondVC 在后台可见。 mmmmmm 考虑解决问题,因为如果有办法实现这一点,就必须像 idk 那样进行演示,或者是否有可能开箱即用,例如在第二个 alpha 中设置视图到 0 什么的 就像它必须呈现才能添加到视图堆栈中,否则它不存在,它必须先初始化,这样你才能回到它 你能详细说明一下吗? 【参考方案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)
【讨论】:
【参考方案2】:在呈现视图控制器的视图呈现之前,您不能呈现视图控制器。因此,不可能同时呈现两个视图控制器,其中第二个呈现源自第一个——第一个必须首先呈现其视图。
但解决方案仍然相当基本。如果用户从 A 到 B,则您像往常一样从 A 呈现 B。如果用户从 A 到 C,则您从 A 呈现 C,但 C 是一个容器视图控制器,有两个孩子(B 和 C,C 显然在顶部)。因此,当用户关闭 C 时,他并没有真正关闭任何东西,而是将 C 动画化以显示 B(使用与关闭相同的动画)。对用户来说,它看起来都一样。
【讨论】:
以上是关于如何将两个视图控制器显示为模态但仅对第二个进行动画转换?的主要内容,如果未能解决你的问题,请参考以下文章