iOS自定义转场动画基本原理

在我们开发iOS过程中页面切换常用的pop/push或者着show/dismiss 两种方式,这两种方式切换或者弹出页面都有默认的转场动画。但随着客户端交互越来越追求个性化的今天,我们就需要自定义转场动画了。

转场 Transitioning API

iOS系统转场动画是通过一套协议来实现的,这使我们可以为自己的应用程序做出最佳实施选择:使用系统自带或新建自定义的动画来管理页面切换。在本节结束时,我们将了解每个协议的职责以及它们之间的连接。下图显示了这套协议 API 的主要组件:

vc转场动画.jpg 通过上面这张图我们可以看到: 页面控制器ViewController 通过它的转场代理transitioningDelegate 来实现转场。

转场代理Transitioning Delegate

每个页面控制器都可以有一个转场代理transitioningDelegate,这个代理是遵循了 UIViewControllerTransitioningDelegate 协议的对象。 每当App呈现或关闭ViewController时,UIKit 都会要求transitioningDelegate提供一个动画控制器Animation Controller。要将默认动画替换为自定义动画,我们必须实现一个过渡协议方法并让它返回适当的动画控制器。

动画控制器Animation Controller

transitioningDelegate返回的动画控制器(Animation Controller)是一个实现 UIViewControllerAnimatedTransitioning 的对象。它完成了实现动画过渡的“繁重工作”。

过渡上下文Transitioning Context

实现了 UIViewControllerContextTransitioning 并在过渡过程中发挥着至关重要的作用:它封装了有关过渡中涉及的View和ViewController(fromVC和targetVC)的信息。

正如我们在上图中看到的那样,我们不需要自己实现此协议。 UIKit 已经创建和配置过渡上下文,并在每次过渡发生时将其传递给动画控制器。

转场过程

以下是(present)转场中涉及的步骤

  1. 开启转场:代码或者通过storyboard+segue 跳转页面
  2. UIKit 向“to”视图控制器(要显示的视图控制器)请求其转场代理。如果没有,UIKIt 使用标准的内置转换。
  3. 然后UIKit通过转场代理通过 animationController(forPresented:presenting:source:) 获取动画控制器. 如果返回为 nil, 则使用默认动画。
  4. UIKit 构建过渡上下文.
  5. UIKit 通过动画控制器调用 transitionDuration(using:)方法来获取动画持续时长
  6. UIKit 调用动画控制器的 animateTransition(using:) 方法来执行过渡动画。
  7. 最后,动画控制器在过渡上下文上调用 completeTransition(_:) 方法以指示动画已完成。

消失(dismiss)的步骤几乎相同。在这种情况下,UIKit 向“from”视图控制器(被解除的那个)询问它的转场代理。转场代理通过 animationController(forDismissed:) 提供适当的动画控制器。

猜你喜欢

转载自juejin.im/post/7099103326666489863
今日推荐