iOS如何自定义转场动画

发布时间:2021-09-27 14:30:52 作者:小新
来源:亿速云 阅读:146

这篇文章给大家分享的是有关iOS如何自定义转场动画的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。

预备

首先,我们现在介绍几个在自定义转场动画时需要接触的协议:

UIViewControllerAnimatedTransitioning: 实现此协议的实例控制转场动画效果。UIViewControllerInteractiveTransitioning: 实现此协议的实例控制着利用手势过渡时的进度处理。

我们在定义好了实现上面两个协议的类后,只需要在需要进行转场的地方,提供对应的对象即可。

ps:下面的实例中,请大家忽略动画效果,关注实现。(其实是懒得去写太多动画了。?‍♂️)

模态跳转(Present)

场景

self.present(vc!, animated: true) {}self.dismiss(animated: true) {}

实现步骤

  1. 设置将要 present 的 ViewController 的 transitioningDelegate 对象,此对象是实现协议 UIViewControllerTransitioningDelegate 的实例。实现 UIViewControllerTransitioningDelegate 协议中的几个代理方法,返回实现了 UIViewControllerAnimatedTransitioning 协议的动画效果控制类。

需要实现的UIViewControllerTransitioningDelegate方法:

//返回用于 present 的自定义 transition 动画optional func animationController(forPresented presented: UIViewController, presenting: UIViewController, source: UIViewController) -> UIViewControllerAnimatedTransitioning?//返回用于 dismiss 的自定义 transition 动画optional func animationController(forDismissed dismissed: UIViewController) -> UIViewControllerAnimatedTransitioning?

实例

/// 第一个 VC 中点击跳转func presentClick(_ sender: Any) {  let vc = self.storyboard?.instantiateViewController(withIdentifier: "PresentSecondViewController")  vc?.modalPresentationStyle = .fullScreen  vc?.transitioningDelegate = self  self.present(vc!, animated: true) {}}// 第一个 VC 实现协议,返回控制转场动画效果的实例extension PresentFirstViewController: UIViewControllerTransitioningDelegate { func animationController(forPresented presented: UIViewController, presenting: UIViewController, source: UIViewController) -> UIViewControllerAnimatedTransitioning? {  return NormalPresentAnimator() } func animationController(forDismissed dismissed: UIViewController) -> UIViewControllerAnimatedTransitioning? {  return NormalPresentAnimator() }}

导航控制器跳转(Push)

场景

self.navigationController?.pushViewController(vc!, animated: true)self.navigationController?.popViewController(animated: true)

实现步骤

  1. 设置导航控制器 UINavigationController 的 delegate。实现 UINavigationControllerDelegate 协议中的代理方法,返回实现了 UIViewControllerAnimatedTransitioning 协议的动画效果控制类。

需要实现的UINavigationControllerDelegate方法:

optional func navigationController(_ navigationController: UINavigationController,        animationControllerFor operation: UINavigationController.Operation,        from fromVC: UIViewController,        to toVC: UIViewController) -> UIViewControllerAnimatedTransitioning?

实例

class PushFirstViewController: UIViewController { override func viewDidLoad() {  super.viewDidLoad()  self.navigationController?.delegate = self } @IBAction func pushClick(_ sender: Any) {  let vc = self.storyboard?.instantiateViewController(withIdentifier: "PushSecondViewController")  self.navigationController?.pushViewController(vc!, animated: true) }}extension PushFirstViewController: UINavigationControllerDelegate { //返回自定义过渡动画 func navigationController(_ navigationController: UINavigationController,        animationControllerFor operation: UINavigationController.Operation,        from fromVC: UIViewController,        to toVC: UIViewController) -> UIViewControllerAnimatedTransitioning? {  if operation == .pop && fromVC is PushFirstViewController {   return nil  }  return NormalPushAnimator() }}

UITabbarController

在前面的两个专场实现中,我们在需要转场的类中分别实现了UIViewControllerTransitioningDelegate 及 UINavigationControllerDelegate 方法,在这两个协议中,还有这样几个方法:

/// UIViewControllerTransitioningDelegateoptional func interactionControllerForPresentation(using animator: UIViewControllerAnimatedTransitioning) -> UIViewControllerInteractiveTransitioning?optional func interactionControllerForDismissal(using animator: UIViewControllerAnimatedTransitioning) -> UIViewControllerInteractiveTransitioning?/// UINavigationControllerDelegateoptional func navigationController(_ navigationController: UINavigationController,          interactionControllerFor animationController: UIViewControllerAnimatedTransitioning) -> UIViewControllerInteractiveTransitioning?

上面这几个方法呢?其实就是我们通过利用手势转场时过渡的进度处理方法。我们需要在代理方法中返回一个实现了 UIViewControllerInteractiveTransitioning 协议的对象来对转场进度进行控制。下面的 UITabbarController 中我就实现一个利用手势控制转场的例子。 Present 及 Push/Pop 按照相同的思路实现即可。

场景

UITabbarController 在默认的状态下,切换控制器时是没有动画效果的。如果需要动画效果的话,需要我们进行自定义。

实现步骤

  1. 设置 UITabbarController 的 delegate。实现 UITabBarControllerDelegate 协议中的代理方法,返回实现了 UIViewControllerAnimatedTransitioning 协议的动画效果控制类,以及返回实现了 UIViewControllerInteractiveTransitioning 协议的转场进度控制类。

/// 返回实现了 UIViewControllerAnimatedTransitioning 协议的实例func tabBarController(_ tabBarController: UITabBarController,       animationControllerForTransitionFrom fromVC: UIViewController,       to toVC: UIViewController) -> UIViewControllerAnimatedTransitioning?/// 返回实现了 UIViewControllerInteractiveTransitioning 协议的实例func tabBarController(_ tabBarController: UITabBarController,       interactionControllerFor animationController: UIViewControllerAnimatedTransitioning) -> UIViewControllerInteractiveTransitioning?

实例

class TabbarController: UITabBarController, UITabBarControllerDelegate { override func viewDidLoad() {  super.viewDidLoad()  self.delegate = self}func tabBarController(_ tabBarController: UITabBarController,       animationControllerForTransitionFrom fromVC: UIViewController,       to toVC: UIViewController) -> UIViewControllerAnimatedTransitioning? { if self.selectedIndex == 0 {  return TabbarAnimator(edge: .right) } else {  return TabbarAnimator(edge: .left) }}func tabBarController(_ tabBarController: UITabBarController,       interactionControllerFor animationController: UIViewControllerAnimatedTransitioning) -> UIViewControllerInteractiveTransitioning? { if self.panGesture.state == .began || self.panGesture.state == .changed {  return TabbarInteractionTransition(pan: self.panGesture) } else {  return nil }}

三方框架——Lottie

介绍

Lottie 是 Android 和 iOS 的移动库,用 bodymovin 解析 Adobe After Effects 导出为 json 的动画并在移动设备上生成矢量动画。设计师可以轻松的创建漂亮(复杂)的动画,无需程序员辛苦地手动去创建及调试。

场景

实现一些特殊的转场,且程序员无足够时间调试动画时。

实现步骤

  1. 在工程中导入 Lottie 框架。在需要转场的类中,将 Lottie import。因为 Lottie 实现的转场实际上是 Present 的转场,所以设置将要 Present 的控制器的 transitioningDelegate。实现 UIViewControllerTransitioningDelegate 协议中的几个代理方法,返回利用转场动画 json 文件初始化的 LOTAnimationTransitionController 的实例。

ps:Lottie 转场的 LOTAnimationTransitionController 在 3.0.0 版本后被移除,所以需要使用 Lottie 做转场时,需要在导入时,指定版本号为更早的版本。我这里使用的是 2.5.3。

实例

/// 第一个 VCfunc presentClick(_ sender: Any) { let vc = self.storyboard?.instantiateViewController(withIdentifier: "LottieSecondViewController") vc?.transitioningDelegate = self self.present(vc!, animated: true) {}}/// 实现 UIViewControllerTransitioningDelegate,返回 LOTAnimationTransitionController 的实例extension LottieFirstViewController: UIViewControllerTransitioningDelegate { func animationController(forPresented presented: UIViewController, presenting: UIViewController, source: UIViewController) -> UIViewControllerAnimatedTransitioning? {  let transitionController = LOTAnimationTransitionController(animationNamed: "Count",                 fromLayerNamed: "",                 toLayerNamed: "",                 applyAnimationTransform: false)  return transitionController } func animationController(forDismissed dismissed: UIViewController) -> UIViewControllerAnimatedTransitioning? {  let transitionController = LOTAnimationTransitionController(animationNamed: "Three",                 fromLayerNamed: "",                 toLayerNamed: "",                 applyAnimationTransform: false)  return transitionController }}

感谢各位的阅读!关于“iOS如何自定义转场动画”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识,如果觉得文章不错,可以把它分享出去让更多的人看到吧!

推荐阅读:
  1. UINavigationController 自定义转场动画(模仿淘宝App跳转)
  2. iOS自定义键盘

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

ios

上一篇:RHEL5使用自动挂载工具Autofs挂载文件的方法

下一篇:Linux Deepin2014的介绍以及特点是怎样的

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》