导航控制器中的两个不同的自定义转换

Posted

技术标签:

【中文标题】导航控制器中的两个不同的自定义转换【英文标题】:two different custom transitions in a navigationController 【发布时间】:2018-10-04 20:39:27 【问题描述】:

我正在尝试在导航控制器中进行两种不同的自定义过渡(一种淡入淡出,一种从顶部滑动)。

第一次过渡效果很好,但是当弹出过渡效果很疯狂。 我想 navigationController.delegate 是关键,但我自己无法弄清楚。 任何帮助将不胜感激 非常感谢

************************************ ios14问题更新************ ***********************************

你好, @Vlad 设置代表的解决方案非常感谢。

但最近在 IOS14 中,当在导航返回按钮上检测到长按手势时会出现一个堆栈菜单(允许用户在导航控制器的视图控制器堆栈中导航)。

因此,当弹出两个或多个控制器时,navigationcontroller 委托设置为错误的控制器。

我再次请求您的支持 ;)

【问题讨论】:

你能证明比“装疯”更多的细节吗?当你流行时,你在哪个 VC 中; A、B 还是 C?能否提供代码示例? 当然@Vlad,谢谢你的回答。 A 用 anim1 推到 B,然后 B 用 anim2 推到 C 一切正常。在弹出时,C 像预期的那样使用 anim2 弹出到 B,但是 B 使用 anim2 弹出到 A 是错误的。然后如果 A 再次推送到 B,它会使用默认动画(苹果动画中的幻灯片)进行推送。我正在使用简单的“UIViewControllerAnimatedTransitioning”,“navigationController?.delegate = self”在 viewdidload 中设置,“transitioningDelegate”在为 segue 做准备中设置 感谢您提供的信息。我已经根据您提供的信息发布了答案。如果您需要更多信息来了解问题,请告诉我。 【参考方案1】:

您的起始状态为 VC A。 在 viewDidLoad 之后,navigationController?.delegate 被设置为使用 anim1 的 VC A。 当您推送到 B 时,您将 navigationController?.delegate 设置为 B,它使用 anim2。

当你从 C 弹出到 B 时,anim2 被用作 navigationController?.delegate 是 VC B。 当你从 B 弹出到 A 时,会使用 anim2,因为 navigationController?.delegate 仍然是 VC B

当你弹出 B 时,navigationController?.delegate 被设置为 nil,因为 VC B 的实例被销毁了。 这就是为什么当你再次尝试按下 B 时,会使用默认动画。

两个重要的信息是:

    viewDidLoad 仅在视图完成加载时调用一次,而不是在弹出后再次出现时调用。 navigationController?.delegate 只能指向一个委托。

【讨论】:

感谢@Vlad 的解释。那么你认为有可能让它与 NavigationController 一起工作吗?或者我是否必须通过推送使 A 到 B 和通过模态演示使 B 到 C 才能拥有两个不同的动画? 是的,这是可能的。您可以在 viewDidAppear 而不是 viewDidLoad 中设置委托。这样,每次 VC 出现时都会设置转换。因此,如果出现VC A,则使用anim1,然后在出现VC B 时使用anim2。然后当你弹回 VC A 时,过渡会再次设置为 anim1。

以上是关于导航控制器中的两个不同的自定义转换的主要内容,如果未能解决你的问题,请参考以下文章

视图控制器之间的自定义转换,包括导航栏

故事板中的自定义导航控制器

导航栏控制器中的自定义后退按钮

如何在我的自定义导航控制器中隐藏标签栏?

Swift:嵌入在导航控制器中的视图之间的自定义segue

更改导航控制器 ios 的转换