亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 系統 > iOS > 正文

iOS自定義轉場動畫的幾種情況

2020-07-26 02:19:38
字體:
來源:轉載
供稿:網友

前言

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

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

  • 模態跳轉(Present)
  • 導航控制器跳轉(Push)
  • UITabbarController
  • 三方框架――Lottie

效果圖

預備

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

  • 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 方法,在這兩個協議中,還有這樣幾個方法:

/// UIViewControllerTransitioningDelegateoptional func interactionControllerForPresentation(using animator: UIViewControllerAnimatedTransitioning) -> UIViewControllerInteractiveTransitioning?optional func interactionControllerForDismissal(using animator: UIViewControllerAnimatedTransitioning) -> UIViewControllerInteractiveTransitioning?/// UINavigationControllerDelegateoptional 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。

實例

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

總結

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

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

好了,以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對武林網的支持。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
久久九九全国免费精品观看| 欧美精品在线看| 国产精品va在线播放我和闺蜜| 亚洲国产精品悠悠久久琪琪| 国产精品无av码在线观看| 久久亚洲精品小早川怜子66| 久久精品国产2020观看福利| 国产欧美精品一区二区三区介绍| 91久久嫩草影院一区二区| 成人乱色短篇合集| 懂色aⅴ精品一区二区三区蜜月| 久久综合免费视频影院| 亚洲最大福利网站| 国产狼人综合免费视频| 国产噜噜噜噜久久久久久久久| 日韩午夜在线视频| 亚洲精品视频网上网址在线观看| 91精品久久久久久久久不口人| 日韩小视频在线观看| 中文字幕亚洲无线码在线一区| 北条麻妃久久精品| 欧美成在线视频| 97在线观看视频| 欧美午夜精品久久久久久久| 欧美精品少妇videofree| 久久韩剧网电视剧| 日韩久久免费电影| 97在线免费观看视频| www.久久撸.com| 久久久久久久久久久91| 欧美成人高清视频| 国产精品成人播放| 国产成人jvid在线播放| 91麻豆国产精品| 亚洲成人久久久| 成人中文字幕+乱码+中文字幕| 日韩女在线观看| 国产亚洲欧美aaaa| 98精品国产高清在线xxxx天堂| 国产成人极品视频| 亚洲精品videossex少妇| 亚洲人成在线一二| 欧美孕妇与黑人孕交| 草民午夜欧美限制a级福利片| 国产精品国产三级国产aⅴ浪潮| 欧美日韩国产综合视频在线观看中文| 91免费国产网站| 中文字幕不卡av| 久久久久久有精品国产| 成人伊人精品色xxxx视频| 久久精品成人欧美大片古装| 一本色道久久综合狠狠躁篇的优点| 成人免费视频在线观看超级碰| 国产精品福利无圣光在线一区| 91在线免费看网站| 97视频人免费观看| 动漫精品一区二区| 国产日韩欧美91| 亚洲天堂免费视频| 亚洲第一二三四五区| 日韩欧美一区二区三区久久| 97热在线精品视频在线观看| 欧美日韩一区二区免费在线观看| 国产精品视频在线播放| 亚洲国产精品视频在线观看| 久久精品久久久久久| 国产精品久久国产精品99gif| 国产精品网红福利| 91中文字幕在线观看| 日韩欧美福利视频| 亚洲欧美成人在线| 欧美精品xxx| 中日韩午夜理伦电影免费| 不用播放器成人网| 久久这里只有精品99| 黑人极品videos精品欧美裸| 日韩欧美在线视频日韩欧美在线视频| 亚洲综合色av| 日韩第一页在线| 国产精品久久久久久亚洲调教| 精品福利樱桃av导航| 一区二区三区日韩在线| 欧美人与性动交a欧美精品| 久久频这里精品99香蕉| 国内偷自视频区视频综合| 国产精品精品视频一区二区三区| 亚洲自拍偷拍一区| 国产剧情久久久久久| 亚洲精品wwwww| 亚洲图片欧洲图片av| 成人免费网站在线看| 久久天堂av综合合色| 一区二区三区国产视频| 亚洲精品福利视频| 日韩在线观看免费网站| 高清亚洲成在人网站天堂| 综合欧美国产视频二区| 日韩av免费在线播放| 欧美精品在线视频观看| 中文国产亚洲喷潮| 亚洲精品大尺度| 国产成人久久久精品一区| 国产精品第一视频| 最新国产精品亚洲| 岛国av一区二区三区| 亚洲欧美日韩中文在线| 亚洲精品影视在线观看| 欧美高跟鞋交xxxxhd| 在线国产精品视频| 欧美激情中文网| 91精品国产综合久久香蕉| 在线播放亚洲激情| 欧美最顶级丰满的aⅴ艳星| 久久天天躁夜夜躁狠狠躁2022| 欧美色另类天堂2015| 色婷婷久久一区二区| 久久久久久69| 国产精品久久中文| 国产精品吹潮在线观看| 欧美一级电影在线| 成人网在线免费看| 日韩欧美中文第一页| 久久视频精品在线| 亚洲高清av在线| 亚洲午夜久久久久久久| 精品亚洲精品福利线在观看| 人人做人人澡人人爽欧美| 2019中文在线观看| 日韩电影中文字幕在线观看| 高跟丝袜一区二区三区| 精品亚洲男同gayvideo网站| 久久久人成影片一区二区三区| 国产一区二区三区18| 久99久在线视频| 97色伦亚洲国产| 亚洲激情在线观看| 亚洲国产另类 国产精品国产免费| 国产精品私拍pans大尺度在线| 日韩成人激情影院| 国产激情综合五月久久| 亚洲一区二区三区在线免费观看| 亚洲欧洲一区二区三区久久| 在线播放国产一区二区三区| 精品欧美aⅴ在线网站| 国产精品视频久久| 精品综合久久久久久97| 久久精品99无色码中文字幕| 亚洲一区二区中文字幕| 黄色一区二区在线观看| 精品福利视频导航| 国产精品久久久久久久av大片| 国产成人亚洲综合91精品| 国产97在线视频| 日韩欧美中文字幕在线播放| 成人免费网站在线观看| 久久影视电视剧免费网站| 美女av一区二区| 91精品国产综合久久香蕉的用户体验| 日韩毛片中文字幕| 欧美日韩国产二区| 日韩欧美aaa| 欧美尤物巨大精品爽| 欧美日韩亚洲91| 久热精品视频在线观看|