十年网站开发经验 + 多家企业客户 + 靠谱的建站团队
量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决
这篇文章给大家介绍怎么在iOS中自定义转场动画,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。
创新互联公司是一家集网站建设,正安企业网站建设,正安品牌网站建设,网站定制,正安网站建设报价,网络营销,网络优化,正安网站推广为一体的创新建站企业,帮助传统企业提升企业形象加强企业竞争力。可充分满足这一群体相比中小企业更为丰富、高端、多元的互联网需求。同时我们时刻保持专业、时尚、前沿,时刻以成就客户成长自我,坚持不断学习、思考、沉淀、净化自己,让我们为更多的企业打造出实用型网站。
预备
首先,我们现在介绍几个在自定义转场动画时需要接触的协议:
UIViewControllerAnimatedTransitioning: 实现此协议的实例控制转场动画效果。
UIViewControllerInteractiveTransitioning: 实现此协议的实例控制着利用手势过渡时的进度处理。
我们在定义好了实现上面两个协议的类后,只需要在需要进行转场的地方,提供对应的对象即可。
ps:下面的实例中,请大家忽略动画效果,关注实现。(其实是懒得去写太多动画了。?♂️)
模态跳转(Present)
场景
self.present(vc!, animated: true) {} self.dismiss(animated: true) {}
实现步骤
设置将要 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)
实现步骤
设置导航控制器 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 方法,在这两个协议中,还有这样几个方法:
/// UIViewControllerTransitioningDelegate optional func interactionControllerForPresentation(using animator: UIViewControllerAnimatedTransitioning) -> UIViewControllerInteractiveTransitioning? optional func interactionControllerForDismissal(using animator: UIViewControllerAnimatedTransitioning) -> UIViewControllerInteractiveTransitioning? /// UINavigationControllerDelegate optional func navigationController(_ navigationController: UINavigationController, interactionControllerFor animationController: UIViewControllerAnimatedTransitioning) -> UIViewControllerInteractiveTransitioning?
上面这几个方法呢?其实就是我们通过利用手势转场时过渡的进度处理方法。我们需要在代理方法中返回一个实现了 UIViewControllerInteractiveTransitioning 协议的对象来对转场进度进行控制。下面的 UITabbarController 中我就实现一个利用手势控制转场的例子。 Present 及 Push/Pop 按照相同的思路实现即可。
场景
UITabbarController 在默认的状态下,切换控制器时是没有动画效果的。如果需要动画效果的话,需要我们进行自定义。
实现步骤
设置 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 的动画并在移动设备上生成矢量动画。设计师可以轻松的创建漂亮(复杂)的动画,无需程序员辛苦地手动去创建及调试。
场景
实现一些特殊的转场,且程序员无足够时间调试动画时。
实现步骤
在工程中导入 Lottie 框架。
在需要转场的类中,将 Lottie import。
因为 Lottie 实现的转场实际上是 Present 的转场,所以设置将要 Present 的控制器的 transitioningDelegate。
实现 UIViewControllerTransitioningDelegate 协议中的几个代理方法,返回利用转场动画 json 文件初始化的 LOTAnimationTransitionController 的实例。
ps:Lottie 转场的 LOTAnimationTransitionController 在 3.0.0 版本后被移除,所以需要使用 Lottie 做转场时,需要在导入时,指定版本号为更早的版本。我这里使用的是 2.5.3。
实例
/// 第一个 VC func 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中自定义转场动画就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。