您好,登錄后才能下訂單哦!
這篇文章給大家分享的是有關(guān)iOS如何自定義轉(zhuǎn)場(chǎng)動(dòng)畫的內(nèi)容。小編覺(jué)得挺實(shí)用的,因此分享給大家做個(gè)參考,一起跟隨小編過(guò)來(lái)看看吧。
預(yù)備
首先,我們現(xiàn)在介紹幾個(gè)在自定義轉(zhuǎn)場(chǎng)動(dòng)畫時(shí)需要接觸的協(xié)議:
UIViewControllerAnimatedTransitioning: 實(shí)現(xiàn)此協(xié)議的實(shí)例控制轉(zhuǎn)場(chǎng)動(dòng)畫效果。UIViewControllerInteractiveTransitioning: 實(shí)現(xiàn)此協(xié)議的實(shí)例控制著利用手勢(shì)過(guò)渡時(shí)的進(jìn)度處理。
我們?cè)诙x好了實(shí)現(xiàn)上面兩個(gè)協(xié)議的類后,只需要在需要進(jìn)行轉(zhuǎn)場(chǎng)的地方,提供對(duì)應(yīng)的對(duì)象即可。
ps:下面的實(shí)例中,請(qǐng)大家忽略動(dòng)畫效果,關(guān)注實(shí)現(xiàn)。(其實(shí)是懶得去寫太多動(dòng)畫了。??♂?)
模態(tài)跳轉(zhuǎn)(Present)
場(chǎng)景
self.present(vc!, animated: true) {}self.dismiss(animated: true) {}
實(shí)現(xiàn)步驟
設(shè)置將要 present 的 ViewController 的 transitioningDelegate 對(duì)象,此對(duì)象是實(shí)現(xiàn)協(xié)議 UIViewControllerTransitioningDelegate 的實(shí)例。實(shí)現(xiàn) UIViewControllerTransitioningDelegate 協(xié)議中的幾個(gè)代理方法,返回實(shí)現(xiàn)了 UIViewControllerAnimatedTransitioning 協(xié)議的動(dòng)畫效果控制類。
需要實(shí)現(xiàn)的UIViewControllerTransitioningDelegate方法:
//返回用于 present 的自定義 transition 動(dòng)畫optional func animationController(forPresented presented: UIViewController, presenting: UIViewController, source: UIViewController) -> UIViewControllerAnimatedTransitioning?//返回用于 dismiss 的自定義 transition 動(dòng)畫optional func animationController(forDismissed dismissed: UIViewController) -> UIViewControllerAnimatedTransitioning?
實(shí)例
/// 第一個(gè) VC 中點(diǎn)擊跳轉(zhuǎn)func presentClick(_ sender: Any) { let vc = self.storyboard?.instantiateViewController(withIdentifier: "PresentSecondViewController") vc?.modalPresentationStyle = .fullScreen vc?.transitioningDelegate = self self.present(vc!, animated: true) {}}// 第一個(gè) VC 實(shí)現(xiàn)協(xié)議,返回控制轉(zhuǎn)場(chǎng)動(dòng)畫效果的實(shí)例extension PresentFirstViewController: UIViewControllerTransitioningDelegate { func animationController(forPresented presented: UIViewController, presenting: UIViewController, source: UIViewController) -> UIViewControllerAnimatedTransitioning? { return NormalPresentAnimator() } func animationController(forDismissed dismissed: UIViewController) -> UIViewControllerAnimatedTransitioning? { return NormalPresentAnimator() }}
導(dǎo)航控制器跳轉(zhuǎn)(Push)
場(chǎng)景
self.navigationController?.pushViewController(vc!, animated: true)self.navigationController?.popViewController(animated: true)
實(shí)現(xiàn)步驟
設(shè)置導(dǎo)航控制器 UINavigationController 的 delegate。實(shí)現(xiàn) UINavigationControllerDelegate 協(xié)議中的代理方法,返回實(shí)現(xiàn)了 UIViewControllerAnimatedTransitioning 協(xié)議的動(dòng)畫效果控制類。
需要實(shí)現(xiàn)的UINavigationControllerDelegate方法:
optional func navigationController(_ navigationController: UINavigationController, animationControllerFor operation: UINavigationController.Operation, from fromVC: UIViewController, to toVC: UIViewController) -> UIViewControllerAnimatedTransitioning?
實(shí)例
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 { //返回自定義過(guò)渡動(dòng)畫 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
在前面的兩個(gè)專場(chǎng)實(shí)現(xiàn)中,我們?cè)谛枰D(zhuǎn)場(chǎng)的類中分別實(shí)現(xiàn)了UIViewControllerTransitioningDelegate 及 UINavigationControllerDelegate 方法,在這兩個(gè)協(xié)議中,還有這樣幾個(gè)方法:
/// UIViewControllerTransitioningDelegateoptional func interactionControllerForPresentation(using animator: UIViewControllerAnimatedTransitioning) -> UIViewControllerInteractiveTransitioning?optional func interactionControllerForDismissal(using animator: UIViewControllerAnimatedTransitioning) -> UIViewControllerInteractiveTransitioning?/// UINavigationControllerDelegateoptional func navigationController(_ navigationController: UINavigationController, interactionControllerFor animationController: UIViewControllerAnimatedTransitioning) -> UIViewControllerInteractiveTransitioning?
上面這幾個(gè)方法呢?其實(shí)就是我們通過(guò)利用手勢(shì)轉(zhuǎn)場(chǎng)時(shí)過(guò)渡的進(jìn)度處理方法。我們需要在代理方法中返回一個(gè)實(shí)現(xiàn)了 UIViewControllerInteractiveTransitioning 協(xié)議的對(duì)象來(lái)對(duì)轉(zhuǎn)場(chǎng)進(jìn)度進(jìn)行控制。下面的 UITabbarController 中我就實(shí)現(xiàn)一個(gè)利用手勢(shì)控制轉(zhuǎn)場(chǎng)的例子。 Present 及 Push/Pop 按照相同的思路實(shí)現(xiàn)即可。
場(chǎng)景
UITabbarController 在默認(rèn)的狀態(tài)下,切換控制器時(shí)是沒(méi)有動(dòng)畫效果的。如果需要?jiǎng)赢嬓Ч脑?,需要我們進(jìn)行自定義。
實(shí)現(xiàn)步驟
設(shè)置 UITabbarController 的 delegate。實(shí)現(xiàn) UITabBarControllerDelegate 協(xié)議中的代理方法,返回實(shí)現(xiàn)了 UIViewControllerAnimatedTransitioning 協(xié)議的動(dòng)畫效果控制類,以及返回實(shí)現(xiàn)了 UIViewControllerInteractiveTransitioning 協(xié)議的轉(zhuǎn)場(chǎng)進(jìn)度控制類。
/// 返回實(shí)現(xiàn)了 UIViewControllerAnimatedTransitioning 協(xié)議的實(shí)例func tabBarController(_ tabBarController: UITabBarController, animationControllerForTransitionFrom fromVC: UIViewController, to toVC: UIViewController) -> UIViewControllerAnimatedTransitioning?/// 返回實(shí)現(xiàn)了 UIViewControllerInteractiveTransitioning 協(xié)議的實(shí)例func tabBarController(_ tabBarController: UITabBarController, interactionControllerFor animationController: UIViewControllerAnimatedTransitioning) -> UIViewControllerInteractiveTransitioning?
實(shí)例
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 的移動(dòng)庫(kù),用 bodymovin 解析 Adobe After Effects 導(dǎo)出為 json 的動(dòng)畫并在移動(dòng)設(shè)備上生成矢量動(dòng)畫。設(shè)計(jì)師可以輕松的創(chuàng)建漂亮(復(fù)雜)的動(dòng)畫,無(wú)需程序員辛苦地手動(dòng)去創(chuàng)建及調(diào)試。
場(chǎng)景
實(shí)現(xiàn)一些特殊的轉(zhuǎn)場(chǎng),且程序員無(wú)足夠時(shí)間調(diào)試動(dòng)畫時(shí)。
實(shí)現(xiàn)步驟
在工程中導(dǎo)入 Lottie 框架。在需要轉(zhuǎn)場(chǎng)的類中,將 Lottie import。因?yàn)?Lottie 實(shí)現(xiàn)的轉(zhuǎn)場(chǎng)實(shí)際上是 Present 的轉(zhuǎn)場(chǎng),所以設(shè)置將要 Present 的控制器的 transitioningDelegate。實(shí)現(xiàn) UIViewControllerTransitioningDelegate 協(xié)議中的幾個(gè)代理方法,返回利用轉(zhuǎn)場(chǎng)動(dòng)畫 json 文件初始化的 LOTAnimationTransitionController 的實(shí)例。
ps:Lottie 轉(zhuǎn)場(chǎng)的 LOTAnimationTransitionController 在 3.0.0 版本后被移除,所以需要使用 Lottie 做轉(zhuǎn)場(chǎng)時(shí),需要在導(dǎo)入時(shí),指定版本號(hào)為更早的版本。我這里使用的是 2.5.3。
實(shí)例
/// 第一個(gè) VCfunc presentClick(_ sender: Any) { let vc = self.storyboard?.instantiateViewController(withIdentifier: "LottieSecondViewController") vc?.transitioningDelegate = self self.present(vc!, animated: true) {}}/// 實(shí)現(xiàn) UIViewControllerTransitioningDelegate,返回 LOTAnimationTransitionController 的實(shí)例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 }}
感謝各位的閱讀!關(guān)于“iOS如何自定義轉(zhuǎn)場(chǎng)動(dòng)畫”這篇文章就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,讓大家可以學(xué)到更多知識(shí),如果覺(jué)得文章不錯(cuò),可以把它分享出去讓更多的人看到吧!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。