中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

怎么在iOS中自定義轉場動畫

發布時間:2021-06-11 17:04:20 來源:億速云 閱讀:266 作者:Leah 欄目:移動開發

這篇文章給大家介紹怎么在iOS中自定義轉場動畫,內容非常詳細,感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助。

預備

首先,我們現在介紹幾個在自定義轉場動畫時需要接觸的協議:

  • UIViewControllerAnimatedTransitioning: 實現此協議的實例控制轉場動畫效果。

  • UIViewControllerInteractiveTransitioning: 實現此協議的實例控制著利用手勢過渡時的進度處理。

我們在定義好了實現上面兩個協議的類后,只需要在需要進行轉場的地方,提供對應的對象即可。

ps:下面的實例中,請大家忽略動畫效果,關注實現。(其實是懶得去寫太多動畫了。??♂?)

模態跳轉(Present)

場景

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

實現步驟

  1. 設置將要 present 的 ViewController 的 transitioningDelegate 對象,此對象是實現協議 UIViewControllerTransitioningDelegate 的實例。

  2. 實現 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。

  2. 實現 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 在默認的狀態下,切換控制器時是沒有動畫效果的。如果需要動畫效果的話,需要我們進行自定義。

實現步驟

  1. 設置 UITabbarController 的 delegate。

  2. 實現 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 框架。

  2. 在需要轉場的類中,將 Lottie import。

  3. 因為 Lottie 實現的轉場實際上是 Present 的轉場,所以設置將要 Present 的控制器的 transitioningDelegate。

  4. 實現 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中自定義轉場動畫就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

ios
AI

大安市| 岳普湖县| 哈巴河县| 大连市| 红桥区| 高平市| 柏乡县| 静乐县| 大厂| 衡南县| 瓦房店市| 永德县| 睢宁县| 天津市| 嘉荫县| 察雅县| 张北县| 孟津县| 南充市| 北京市| 德惠市| 扬州市| 来安县| 安丘市| 汾西县| 凉山| 潞西市| 清镇市| 武冈市| 闽清县| 东丽区| 岳阳县| 岱山县| 横山县| 淅川县| 永和县| 石首市| 富宁县| 曲阳县| 芜湖县| 龙游县|