欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

iOS自定義轉(zhuǎn)場動畫的幾種情況

 更新時間:2019年06月30日 15:37:03   作者:即將成為型男的濤  
這篇文章主要給大家介紹了關(guān)于iOS自定義轉(zhuǎn)場動畫的幾種情況,文中通過示例代碼介紹的非常詳細(xì),對各位iOS開發(fā)者們具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧

前言

在開發(fā)中,無論我們使用 Push 還是 Present 推出新的 ViewController 時,系統(tǒng)為了提高用戶體驗都會為我們默認(rèn)加上一些過渡動畫。但是,系統(tǒng)默認(rèn)的動畫總是不能滿足大家各種各樣的需求的,所以系統(tǒng)也為我們提供了在不同場景下自定義過渡動畫以及通過手勢控制過渡進(jìn)度的實(shí)現(xiàn)方案。

這篇文章記錄了自定義轉(zhuǎn)場動畫中的幾種情況:

  • 模態(tài)跳轉(zhuǎn)(Present)
  • 導(dǎo)航控制器跳轉(zhuǎn)(Push)
  • UITabbarController
  • 三方框架——Lottie

效果圖

預(yù)備

首先,我們現(xiàn)在介紹幾個在自定義轉(zhuǎn)場動畫時需要接觸的協(xié)議:

  • UIViewControllerAnimatedTransitioning: 實(shí)現(xiàn)此協(xié)議的實(shí)例控制轉(zhuǎn)場動畫效果。
  • UIViewControllerInteractiveTransitioning: 實(shí)現(xiàn)此協(xié)議的實(shí)例控制著利用手勢過渡時的進(jìn)度處理。

我們在定義好了實(shí)現(xiàn)上面兩個協(xié)議的類后,只需要在需要進(jìn)行轉(zhuǎn)場的地方,提供對應(yīng)的對象即可。

ps:下面的實(shí)例中,請大家忽略動畫效果,關(guān)注實(shí)現(xiàn)。(其實(shí)是懶得去寫太多動畫了。🤦‍♂️)

模態(tài)跳轉(zhuǎn)(Present)

場景

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

實(shí)現(xiàn)步驟

  1. 設(shè)置將要 present 的 ViewController 的 transitioningDelegate 對象,此對象是實(shí)現(xiàn)協(xié)議 UIViewControllerTransitioningDelegate 的實(shí)例。
  2. 實(shí)現(xiàn) UIViewControllerTransitioningDelegate 協(xié)議中的幾個代理方法,返回實(shí)現(xiàn)了 UIViewControllerAnimatedTransitioning 協(xié)議的動畫效果控制類。

需要實(shí)現(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?

實(shí)例

/// 第一個 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) {}
}

// 第一個 VC 實(shí)現(xiàn)協(xié)議,返回控制轉(zhuǎn)場動畫效果的實(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)

場景

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

實(shí)現(xiàn)步驟

  1. 設(shè)置導(dǎo)航控制器 UINavigationController 的 delegate。
  2. 實(shí)現(xiàn) UINavigationControllerDelegate 協(xié)議中的代理方法,返回實(shí)現(xiàn)了 UIViewControllerAnimatedTransitioning 協(xié)議的動畫效果控制類。

需要實(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 {
 //返回自定義過渡動畫
 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

在前面的兩個專場實(shí)現(xiàn)中,我們在需要轉(zhuǎn)場的類中分別實(shí)現(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?

上面這幾個方法呢?其實(shí)就是我們通過利用手勢轉(zhuǎn)場時過渡的進(jìn)度處理方法。我們需要在代理方法中返回一個實(shí)現(xiàn)了 UIViewControllerInteractiveTransitioning 協(xié)議的對象來對轉(zhuǎn)場進(jìn)度進(jìn)行控制。下面的 UITabbarController 中我就實(shí)現(xiàn)一個利用手勢控制轉(zhuǎn)場的例子。 Present 及 Push/Pop 按照相同的思路實(shí)現(xiàn)即可。

場景

UITabbarController 在默認(rèn)的狀態(tài)下,切換控制器時是沒有動畫效果的。如果需要動畫效果的話,需要我們進(jìn)行自定義。

實(shí)現(xiàn)步驟

  1. 設(shè)置 UITabbarController 的 delegate。
  2. 實(shí)現(xiàn) UITabBarControllerDelegate 協(xié)議中的代理方法,返回實(shí)現(xiàn)了 UIViewControllerAnimatedTransitioning 協(xié)議的動畫效果控制類,以及返回實(shí)現(xiàn)了 UIViewControllerInteractiveTransitioning 協(xié)議的轉(zhuǎn)場進(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 的移動庫,用 bodymovin 解析 Adobe After Effects 導(dǎo)出為 json 的動畫并在移動設(shè)備上生成矢量動畫。設(shè)計師可以輕松的創(chuàng)建漂亮(復(fù)雜)的動畫,無需程序員辛苦地手動去創(chuàng)建及調(diào)試。

場景

實(shí)現(xiàn)一些特殊的轉(zhuǎn)場,且程序員無足夠時間調(diào)試動畫時。

實(shí)現(xiàn)步驟

  1. 在工程中導(dǎo)入 Lottie 框架。
  2. 在需要轉(zhuǎn)場的類中,將 Lottie import。
  3. 因為 Lottie 實(shí)現(xiàn)的轉(zhuǎn)場實(shí)際上是 Present 的轉(zhuǎn)場,所以設(shè)置將要 Present 的控制器的 transitioningDelegate。
  4. 實(shí)現(xiàn) UIViewControllerTransitioningDelegate 協(xié)議中的幾個代理方法,返回利用轉(zhuǎn)場動畫 json 文件初始化的 LOTAnimationTransitionController 的實(shí)例。

ps:Lottie 轉(zhuǎn)場的 LOTAnimationTransitionController 在 3.0.0 版本后被移除,所以需要使用 Lottie 做轉(zhuǎn)場時,需要在導(dǎo)入時,指定版本號為更早的版本。我這里使用的是 2.5.3。

實(shí)例

/// 第一個 VC
func 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
 }
}

總結(jié)

上面的所有動畫的示例可以在我的Github上找到哦,各位前快去下載把玩吧。

好的轉(zhuǎn)場動畫,在用戶交互上會帶來更加美妙的體驗。讓用戶盡享絲滑哦。

好了,以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,謝謝大家對腳本之家的支持。

相關(guān)文章

  • IOS 百度糯米客戶端登錄BUG

    IOS 百度糯米客戶端登錄BUG

    這篇文章主要介紹了IOS 百度糯米客戶端登錄BUG,問題分析及解決方案,本文介紹的非常詳細(xì),具有參考價值,特此分享供大家學(xué)習(xí)
    2016-01-01
  • iOS中管理剪切板的UIPasteboard粘貼板類用法詳解

    iOS中管理剪切板的UIPasteboard粘貼板類用法詳解

    在iOS中,通過UITextField、UITextView和UIWebView剪切或復(fù)制的內(nèi)容都可以通過UIPasteboard類來管理粘貼操作,下面就為大家?guī)韎OS中管理剪切板的UIPasteboard粘貼板類用法詳解:
    2016-06-06
  • iOS自動進(jìn)行View標(biāo)記的方法詳解

    iOS自動進(jìn)行View標(biāo)記的方法詳解

    這篇文章主要給大家介紹了關(guān)于iOS自動進(jìn)行View標(biāo)記的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對各位iOS開發(fā)者們具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-04-04
  • 詳解iOS App中圖片的線段涂鴉功能的添加方法

    詳解iOS App中圖片的線段涂鴉功能的添加方法

    這篇文章主要介紹了如何設(shè)計iOS App中圖片的線段涂鴉功能,也就是很多應(yīng)用中圖片上傳時帶有的編輯功能的基礎(chǔ),需要的朋友可以參考下
    2016-03-03
  • swift 常用高階函數(shù)分享

    swift 常用高階函數(shù)分享

    Swift是一門面向協(xié)議的語言,在使用Swift時我們已經(jīng)充分享受到了面向協(xié)議編程帶給我們的便利,但是Swift相比Obj-C還有一個更重要的優(yōu)點(diǎn),那就是對函數(shù)式編程提供了很好的支持,其中Swift提供了map,filter,reduce這三個高階函數(shù)Higher Order function作為對容器的支持
    2017-12-12
  • 分享一個iOS下實(shí)現(xiàn)基本繪畫板功能的簡單方法

    分享一個iOS下實(shí)現(xiàn)基本繪畫板功能的簡單方法

    這篇文章主要介紹了iOS下實(shí)現(xiàn)基本繪畫板功能的簡單方法,代碼基于傳統(tǒng)的Objective-C,需要的朋友可以參考下
    2015-10-10
  • IOS Ble藍(lán)牙開發(fā)實(shí)現(xiàn)方法

    IOS Ble藍(lán)牙開發(fā)實(shí)現(xiàn)方法

    這篇文章主要為大家詳細(xì)介紹了IOS Ble藍(lán)牙開發(fā)的實(shí)現(xiàn)方法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-12-12
  • iOS微信分享配置universal?links步驟解析

    iOS微信分享配置universal?links步驟解析

    這篇文章主要為大家介紹了iOS微信分享配置universal?links步驟詳細(xì)解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-06-06
  • 詳細(xì)整理iOS中UITableView的性能優(yōu)化

    詳細(xì)整理iOS中UITableView的性能優(yōu)化

    最近在微博上看到一個很好的開源項目,是關(guān)于如何優(yōu)化UITableView的,加上正好最近也在優(yōu)化項目中的類似朋友圈功能這塊,思考了很多關(guān)于UITableView的優(yōu)化技巧,所以決定詳細(xì)的整理下對優(yōu)化UITableView的理解,需要的朋友們可以參考借鑒。
    2017-03-03
  • iOS開發(fā)之(APNS)遠(yuǎn)程推送實(shí)現(xiàn)代碼 附證書與真機(jī)調(diào)試

    iOS開發(fā)之(APNS)遠(yuǎn)程推送實(shí)現(xiàn)代碼 附證書與真機(jī)調(diào)試

    這篇文章主要為大家詳細(xì)介紹了iOS開發(fā)之(APNS)遠(yuǎn)程推送實(shí)現(xiàn)代碼,附證書與真機(jī)調(diào)試,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-09-09

最新評論