快速从一个模态 VC 转换到另一个模态 VC

Posted

技术标签:

【中文标题】快速从一个模态 VC 转换到另一个模态 VC【英文标题】:Transition from one modal VC to another without delay swift 【发布时间】:2019-12-04 23:21:09 【问题描述】:

我有一个基本场景:

我以模态方式使用self.present(, animated:, completion:) 呈现VC。 有时由于此模态 VC 中的交互,我需要关闭一个模态并打开另一个模态。 所以我做了以下事情:

weak var presenter = self.presentingViewController
let newVc = UIViewController()
presenter?.dismiss(animated: true, completion: 
   presenter?.present(newVc, animated: true, completion: nil)
)

这可行,但是当用户看到原始演示者并可以尝试与其交互(打开其他模式...)时,切换 VC 时会出现烦人的延迟。

我尝试设置 animated: false 但这似乎不起作用:/

我真的不能为此切换到UINavigationController 模型,因为我展示自己的模式是页面视图控制器并且具有依赖视图的整个层次结构;用户永远不会“返回”;所以我真的很想尽快展示新的模态......

更新我的问题不是关于如何控制或选择动画。我的问题是关于模态之间没有延迟。

【问题讨论】:

您可以将默认动画替换为您想要的任何内容。见developer.apple.com/documentation/uikit/… 你可以让你的视图控制器在不同的容器视图中彼此重叠,当你想在它们之间切换时,你可以让你想显示的一个的 alpha 为 1,其余的为 0。 【参考方案1】:

在没有过渡的情况下切换视图的内置视图控制器架构是标签栏控制器。所以只要把你的视图控制器变成一个标签栏控制器——没有可见的标签栏!要更改为另一个视图控制器,只需更改选项卡(在代码中)。变化是瞬间的。

这个截屏视频清楚地表明了它的工作原理。我们展示了一个视图控制器(黄色)。然后我们立即在两个视图控制器(绿色和黄色)之间来回切换作为呈现的视图控制器。最后,我们忽略正在显示的任何一个(绿色或黄色)。我用简单的按钮来完成这一切,但这只是为了演示;显然你可以随心所欲地做到这一点。架构才是最重要的。

【讨论】:

我喜欢这个解决方案,它很有创意。看看我是否可以像这样重新构建应用程序,不幸的是,要更改很多代码,因为黄色和绿色的家伙对我来说都是相同的实例,所以我需要添加这个选项卡,但只能有条件地启用它:// 在我的示例中,黄色和绿色也是同一个视图控制器类的实例。让它更简单。【参考方案2】:

我只能想到需要您自己处理动画的解决方案

    使用UIViewControllerTransitionCoordinator创建自定义模态转换 按照@muhammed-gül 的建议将控制器添加到容器视图中 在 self 上显示 newVC 并在完成后关闭所有显示的控制器

只是一个提示,你并不总是需要等待 dismiss 完成关闭,你可以调用它,它通常可以工作,但底层的 viewController 仍然是可见的。

dismiss(animated: true)
present(newVC, animated: true)

【讨论】:

以上是关于快速从一个模态 VC 转换到另一个模态 VC的主要内容,如果未能解决你的问题,请参考以下文章

快速解除模式并推送到新的 VC

如何从模态 XIB 设置 VC 的背景颜色

使用模态动画推送 ViewController(水平翻转)

关闭模态呈现的 VC 和弹出呈现的 VC

在 Splitview 中从一个 Detail View 控制器导航到另一个 Detail VC

我怎样才能解雇第二个在第一个 vc 上模态呈现的第一个 vc