Skip to content

19.3_实现UINavigationController的Push或Pop动画

探索UINavigationController的Push/Pop动画

在iOS开发中,UINavigationController是管理视图控制器栈的核心组件。它通过Push和Pop操作实现视图控制器之间的切换,而这些切换过程正是我们施展动画魔法的绝佳舞台!✨ 你将学习如何为这些默认的切换添加自定义动画,让你的应用界面焕然一新。

自定义转场动画的核心协议

要实现自定义的Push/Pop动画,你需要深入理解并实现两个关键协议。它们是UIViewControllerAnimatedTransitioningUINavigationControllerDelegate。通过它们,你将完全掌控转场动画的每一个细节。

  • UIViewControllerAnimatedTransitioning: 这个协议定义了动画的实际内容和持续时间。你需要实现它的两个核心方法:
    • transitionDuration(using:):返回动画的持续时间,例如0.5秒。
    • animateTransition(using:):这是动画逻辑的核心,你在这里定义视图如何从一个状态过渡到另一个状态。
  • UINavigationControllerDelegate: 这个协议允许你告诉UINavigationController使用你的自定义动画对象。你需要实现navigationController(_:animationControllerFor:from:to:)方法,并在其中返回你的自定义动画对象。

实现Push动画:从无到有

让我们以一个Push动画为例,详细讲解实现步骤。想象一下,当一个新视图控制器被推入时,它能从屏幕底部优雅地滑入。这会给用户带来非常流畅的体验!

  1. 创建动画对象: 首先,你需要创建一个遵循UIViewControllerAnimatedTransitioning协议的类,比如CustomPushAnimator
  2. 定义动画时长: 在CustomPushAnimator中,实现transitionDuration(using:)方法,返回你想要的动画时长,例如0.7秒。
  3. 编写动画逻辑: 在animateTransition(using:)方法中,你将获取到转场上下文(transitionContext)。
    • 获取源视图控制器(fromVC)和目标视图控制器(toVC)的视图。
    • 将目标视图添加到容器视图(containerView)中。
    • 设置目标视图的初始位置,例如在屏幕下方。
    • 使用UIView.animate方法,将目标视图动画到最终位置,同时可以调整源视图的透明度或位置,创造出丰富的视觉效果。
    • 动画完成后,务必调用transitionContext.completeTransition(true)来通知系统动画已完成。

实现Pop动画:优雅地返回

Pop动画与Push动画类似,但方向相反。当用户点击返回按钮时,你可以让当前视图控制器优雅地滑出屏幕,而前一个视图控制器则重新出现。

  1. 创建Pop动画对象: 同样,创建一个遵循UIViewControllerAnimatedTransitioning协议的类,例如CustomPopAnimator
  2. 定义动画时长: 在CustomPopAnimator中,设置动画时长,例如0.6秒。
  3. 编写动画逻辑: 在animateTransition(using:)方法中:
    • 获取源视图控制器(当前显示的视图)和目标视图控制器(即将显示的视图)。
    • 将目标视图插入到容器视图的底部,确保它在源视图的下方。
    • 设置源视图的最终位置,例如滑出屏幕。
    • 使用UIView.animate进行动画,将源视图移出屏幕,同时目标视图可以逐渐显现。
    • 动画结束后,调用transitionContext.completeTransition(true)

整合到UINavigationControllerDelegate

最后一步是将你的自定义动画对象与UINavigationController关联起来。

  1. 设置代理: 在你的UINavigationController的代理对象(通常是你的根视图控制器或一个专门的代理类)中,将navigationController.delegate设置为自身。
  2. 实现代理方法: 实现navigationController(_:animationControllerFor:from:to:)方法。
    • 在这个方法中,你需要判断当前是Push操作还是Pop操作。
    • 如果是Push,返回你的CustomPushAnimator实例。
    • 如果是Pop,返回你的CustomPopAnimator实例。

通过这些步骤,你就能为UINavigationController的Push/Pop操作注入生动的自定义动画,让你的应用界面更具吸引力!🚀 这种能力在许多流行的应用中都有体现,例如一些社交媒体应用在切换个人资料页面时会使用独特的转场效果。

本站使用 VitePress 制作