這篇文章給大家介紹怎么在iOS中自定義轉場動畫,內(nèi)容非常詳細,感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助。
寶雞ssl適用于網(wǎng)站、小程序/APP、API接口等需要進行數(shù)據(jù)傳輸應用場景,ssl證書未來市場廣闊!成為成都創(chuàng)新互聯(lián)公司的ssl證書銷售渠道,可以享受市場價格4-6折優(yōu)惠!如果有意向歡迎電話聯(lián)系或者加微信:18982081108(備注:SSL證書合作)期待與您的合作!預備
首先,我們現(xiàn)在介紹幾個在自定義轉場動畫時需要接觸的協(xié)議:
UIViewControllerAnimatedTransitioning: 實現(xiàn)此協(xié)議的實例控制轉場動畫效果。
UIViewControllerInteractiveTransitioning: 實現(xiàn)此協(xié)議的實例控制著利用手勢過渡時的進度處理。
我們在定義好了實現(xiàn)上面兩個協(xié)議的類后,只需要在需要進行轉場的地方,提供對應的對象即可。
ps:下面的實例中,請大家忽略動畫效果,關注實現(xiàn)。(其實是懶得去寫太多動畫了。??♂?)
模態(tài)跳轉(Present)
場景
self.present(vc!, animated: true) {} self.dismiss(animated: true) {}
實現(xiàn)步驟
設置將要 present 的 ViewController 的 transitioningDelegate 對象,此對象是實現(xiàn)協(xié)議 UIViewControllerTransitioningDelegate 的實例。
實現(xiàn) UIViewControllerTransitioningDelegate 協(xié)議中的幾個代理方法,返回實現(xiàn)了 UIViewControllerAnimatedTransitioning 協(xié)議的動畫效果控制類。
需要實現(xiàn)的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 實現(xiàn)協(xié)議,返回控制轉場動畫效果的實例 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)
實現(xiàn)步驟
設置導航控制器 UINavigationController 的 delegate。
實現(xiàn) UINavigationControllerDelegate 協(xié)議中的代理方法,返回實現(xiàn)了 UIViewControllerAnimatedTransitioning 協(xié)議的動畫效果控制類。
需要實現(xiàn)的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
在前面的兩個專場實現(xiàn)中,我們在需要轉場的類中分別實現(xiàn)了UIViewControllerTransitioningDelegate 及 UINavigationControllerDelegate 方法,在這兩個協(xié)議中,還有這樣幾個方法:
/// 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?
上面這幾個方法呢?其實就是我們通過利用手勢轉場時過渡的進度處理方法。我們需要在代理方法中返回一個實現(xiàn)了 UIViewControllerInteractiveTransitioning 協(xié)議的對象來對轉場進度進行控制。下面的 UITabbarController 中我就實現(xiàn)一個利用手勢控制轉場的例子。 Present 及 Push/Pop 按照相同的思路實現(xiàn)即可。
場景
UITabbarController 在默認的狀態(tài)下,切換控制器時是沒有動畫效果的。如果需要動畫效果的話,需要我們進行自定義。
實現(xiàn)步驟
設置 UITabbarController 的 delegate。
實現(xiàn) UITabBarControllerDelegate 協(xié)議中的代理方法,返回實現(xiàn)了 UIViewControllerAnimatedTransitioning 協(xié)議的動畫效果控制類,以及返回實現(xiàn)了 UIViewControllerInteractiveTransitioning 協(xié)議的轉場進度控制類。
/// 返回實現(xiàn)了 UIViewControllerAnimatedTransitioning 協(xié)議的實例 func tabBarController(_ tabBarController: UITabBarController, animationControllerForTransitionFrom fromVC: UIViewController, to toVC: UIViewController) -> UIViewControllerAnimatedTransitioning? /// 返回實現(xiàn)了 UIViewControllerInteractiveTransitioning 協(xié)議的實例 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 的動畫并在移動設備上生成矢量動畫。設計師可以輕松的創(chuàng)建漂亮(復雜)的動畫,無需程序員辛苦地手動去創(chuàng)建及調(diào)試。
場景
實現(xiàn)一些特殊的轉場,且程序員無足夠時間調(diào)試動畫時。
實現(xiàn)步驟
在工程中導入 Lottie 框架。
在需要轉場的類中,將 Lottie import。
因為 Lottie 實現(xiàn)的轉場實際上是 Present 的轉場,所以設置將要 Present 的控制器的 transitioningDelegate。
實現(xiàn) UIViewControllerTransitioningDelegate 協(xié)議中的幾個代理方法,返回利用轉場動畫 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) {} } /// 實現(xiàn) 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中自定義轉場動畫就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。
另外有需要云服務器可以了解下創(chuàng)新互聯(lián)建站www.cdcxhl.com,海內(nèi)外云服務器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務器、裸金屬服務器、高防服務器、香港服務器、美國服務器、虛擬主機、免備案服務器”等云主機租用服務以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務可用性高、性價比高”等特點與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應用場景需求。