Swit轉場動畫的簡單分析

2024-05-10 09:08
文章标签 分析 簡單 動畫 swit 轉場

本文主要是介绍Swit轉場動畫的簡單分析,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

首先, 我們得了解什麼是轉場動畫. 

1. 轉場動畫即是對一個view呈現和關閉時所做的動畫, 叫轉場動畫. 

動畫是如何做出來的呢?

一. 了解CALayer與CGContext和UIView之間的關係

1. 以前我們學習UIView的時候, 應該知道, 當創建一個UIView的時候,系統會默認將UIView的LayerClass設置為layer類型.那麼什麼是layer呢?

 -1.1 layer即是圖層, 是CALayer類型的實例. 而CALayer包含在QuartzCore框架中,這是一個跨平台的框架,即可以用在ios中又可以用在Mac OS X中.在使用Core Animation開發動畫的本質就是將CALayer中的內容轉化為位圖從而供硬件操作,所以要熟練掌握動畫操作必須先熟悉CALayer.

-1.2 又多一個問題了, 那麼CALayer是什麼?首先, UIView有一個屬性是layer, 在這個屬性有下面這麼一段注析

: public var layer: CALayer { get } // returns view's layer. Will always return a non-nil value. view is layer's delegate
很明顯, 這個屬性返回一個layer, 並且當前View是這個Layer的代理. 那麼既然是代理, 說明當前view可以實現Layer的代理方法來對當前view的layer進行操作.
那麽就探一下CALayer內部都有些啥東西: 
public init()
public init(layer: AnyObject)
public func presentationLayer() -> AnyObject?
public func modelLayer() -> AnyObject
public class func defaultValueForKey(key: String) -> AnyObject?
public class func needsDisplayForKey(key: String) -> Bool
public func shouldArchiveValueForKey(key: String) -> Bool
public var bounds: CGRect
public var position: CGPoint
等等......太多了就不列出來了, 這裡只做個簡單的分析. 
很明顯CALayer內部的方法都是用來操作layer的一些構造方法,屬性等. 至上而下可以很清晰的明白,CALayer不是UIKit的東西, 是在QuartzCore框架下聲明的一個類. 
-1.3 說這麼多, 那麼layer到底有什麼作用?
首先我們通過CALayer的一個代理方法來說明下:
override func drawLayer(layer: CALayer, inContext ctx: CGContext)
通過這個代理方法, 可以對圖層進行繪製. 我kao, 這裡有多了一個CGContext的類, 有是神馬東西? 讓我們來逐步分析:
CGContext ctx : 圖形上下文
CALayer layer: 當前layer
通過上面的代理方法, 可以拿到圖形上下文, 而圖形上下文裡面存放著當前layer繪製圖形的所有數據, 既然是專門用來繪製圖形的上下文, 那麼我們只要通過對上下文內的數據進行需修改, 就可以完成在layer上面的繪製. 說到這裡應該很清晰了吧?讓我們直接點進去CGContext裡面看看有什麼方法可以用來修改上下文的數據: 
public func CGContextScaleCTM(c: CGContext?, _ sx: CGFloat_ sy: CGFloat)
@available(iOS 2.0, *)
public func CGContextTranslateCTM(c: CGContext?, _ tx: CGFloat_ ty: CGFloat)
等等...這裡不一一列出來了, 因為太多了, 這裡只做簡單分析. 很明顯, 這兩個方法是通過傳入一個 c : 上下文 , 再通過傳入參數對上下文內的數據進行修改來繪製Scale和Translate. 

好了,讓我們總結一下layer的作用吧. 通過上面一些雜亂東西的分析,layer其實就是一個畫板, 通過CALayer內部的方法可以修改畫板的一些基本屬性, 通過CALayer的代理方法可以拿到畫板繪製圖形的各種數據, 通過對圖形上下文數據的修改來進行圖片繪製,並且最終畫在Layer上.說白了, Layer就是一個用來呈現圖形的畫板,沒有Layer, 就看不見任何東西.

二. 轉場動畫的實現

上面第一點也說了, 轉場動畫是View呈現和關閉的時候的過渡動畫.
很簡單, 既然是View的動畫,我們可以通過UIView提供的動畫方法來實現: 
@available(iOS 4.0, *)
    public class func animateWithDuration(duration: NSTimeInterval, delay: NSTimeInterval, options: UIViewAnimationOptions, animations: () -> Void, completion: ((Bool) -> Void)?)
@available(iOS 4.0, *)
    public class func animateWithDuration(duration: NSTimeInterval, animations: () -> Void, completion: ((Bool) -> Void)?)
@available(iOS 4.0, *)
    public class func animateWithDuration(duration: NSTimeInterval, animations: () -> Void)
@available(iOS 4.0, *)
    public class func transitionWithView(view: UIView, duration: NSTimeInterval, options: UIViewAnimationOptions, animations: (() -> Void)?, completion: ((Bool) -> Void)?)
等等, 這些都是UIView內部提供的實現動畫的方法.但是這些方法並不能滿足我們的全部需求,因為在modal一個控制器的時候, 我們可以通過這些方法控制View在即將顯示和正在顯示的這段時間內做動畫, 而不能對控制器,View和ContainerView進行操作.對控制器的呈現和關閉做一個自定義的動畫, 即是轉場動畫.
我靠, 這裡又多了一個ContainerView, 又是神馬東西? 
ContainerView: 容器視圖, 用於存放動畫所需要的控件,所有跟動畫有關的控件都放在裡面.
好, 讓我們舉個例子來簡單的說明Swift中轉場動畫的使用.我盡量說得詳細點, 耐心看下去就懂了.
需求: 在一個NavigationBar控制器上點擊RightButton, 呈現一個自定義尺寸,動畫的控制器.
分析: 首先控制器的層級結構是 UIWindow -> RootViewController -> UINavigationController
此時我們需要了解幾個UIViewController中的屬性: 
1.presentedViewController: 這是一個被當前控制器或者其最近的父控制器所modal的控制器
2.presentingViewController: presentedViewController的根控制器, 即最遠的祖先控制器
3.transitioningDelegate : UIViewControllerTransitioningDelegate : 轉場動畫代理

好, 既然UIViewController提供了一個轉場動畫的代理, 那麼我們只需要實現下代理方法, 即可以完成轉場動畫了. 好像很快要實現動畫了, 很緊張的趕腳.
第一步:
首先創建一個類, 並且讓它成為transitioningDelegate的代理
第二步:
實現代理方法:

1作用: 當自定義顯示控制器(UIPresentationController)呈現一個控制器時管理視圖層次結構, 向代理發送請求. (這個自定義顯示控制器(UIPresentationCtroller)是用來管理modal的顯示佈局)
參數: 這個方法需要我們返回一個UIPresentationController的實例
運用: 接下來,我們需要手動創建一個UIPresentationController實例,並且實現其內部構造方法來對modal控制器的佈局, 最後返回該對象即可.
1. func presentationControllerForPresentedViewController(presented: UIViewController, presentingViewController presenting: UIViewController, sourceViewController source: UIViewController) -> UIPresentationController?
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

2作用:返回一個遵守UIViewControllerAnimatedTransitioning協議的對象, 設置在控制器 呈現的時候通過該對象實現UIViewControllerAnimatedTransitioning中的代理方法.
協議: UIViewControllerAnimatedTransitioning
協議方法: 1.  public   func  transitionDuration(transitionContext:  UIViewControllerContextTransitioning ?) ->  NSTimeInterval  (功能: 返回動畫時長)
2.  public   func  animateTransition(transitionContext:  UIViewControllerContextTransitioning )  (功能: 控制器的呈現和關閉都會掉用此方法)
3.  optional   public   func  animationEnded(transitionCompleted:  Bool )  (功能: 動畫結束時調用此方法)
分析: 該協議的方法傳入了一個新的東西: transitionContext , 轉場上下文, 裡面存放著有關轉場動畫的所有數據.
運用: 1. 通過  transitionContext. viewForKey ( UITransitionContextToViewKey )! 可以拿到需要呈現的控制器的view
2. 通過  transitionContext. viewForKey ( UITransitionContextFromViewKey )! 可以拿到需要發起控制器的view
3. 通過拿到的控制器的view, 在 public   func  animateTransition(transitionContext:  UIViewControllerContextTransitioning ) 方法中判斷控制器的呈現和關閉來實現動畫.

2. func animationControllerForPresentedController(presented: UIViewController, presentingController presenting: UIViewController, sourceController source: UIViewController) -> UIViewControllerAnimatedTransitioning?
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
作用:返回一個遵守UIViewControllerAnimatedTransitioning協議的對象, 設置在控制器關閉的時候通過該對象實現UIViewControllerAnimatedTransitioning中的代理方法.
3.func animationControllerForDismissedController(dismissed: UIViewController) -> UIViewControllerAnimatedTransitioning?
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------


好了,基本上通過以上的操作, 就可以完成自定義的轉場動畫了. 真的感覺不費吹灰之力.

这篇关于Swit轉場動畫的簡單分析的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/976008

相关文章

性能分析之MySQL索引实战案例

文章目录 一、前言二、准备三、MySQL索引优化四、MySQL 索引知识回顾五、总结 一、前言 在上一讲性能工具之 JProfiler 简单登录案例分析实战中已经发现SQL没有建立索引问题,本文将一起从代码层去分析为什么没有建立索引? 开源ERP项目地址:https://gitee.com/jishenghua/JSH_ERP 二、准备 打开IDEA找到登录请求资源路径位置

SWAP作物生长模型安装教程、数据制备、敏感性分析、气候变化影响、R模型敏感性分析与贝叶斯优化、Fortran源代码分析、气候数据降尺度与变化影响分析

查看原文>>>全流程SWAP农业模型数据制备、敏感性分析及气候变化影响实践技术应用 SWAP模型是由荷兰瓦赫宁根大学开发的先进农作物模型,它综合考虑了土壤-水分-大气以及植被间的相互作用;是一种描述作物生长过程的一种机理性作物生长模型。它不但运用Richard方程,使其能够精确的模拟土壤中水分的运动,而且耦合了WOFOST作物模型使作物的生长描述更为科学。 本文让更多的科研人员和农业工作者

MOLE 2.5 分析分子通道和孔隙

软件介绍 生物大分子通道和孔隙在生物学中发挥着重要作用,例如在分子识别和酶底物特异性方面。 我们介绍了一种名为 MOLE 2.5 的高级软件工具,该工具旨在分析分子通道和孔隙。 与其他可用软件工具的基准测试表明,MOLE 2.5 相比更快、更强大、功能更丰富。作为一项新功能,MOLE 2.5 可以估算已识别通道的物理化学性质。 软件下载 https://pan.quark.cn/s/57

衡石分析平台使用手册-单机安装及启动

单机安装及启动​ 本文讲述如何在单机环境下进行 HENGSHI SENSE 安装的操作过程。 在安装前请确认网络环境,如果是隔离环境,无法连接互联网时,请先按照 离线环境安装依赖的指导进行依赖包的安装,然后按照本文的指导继续操作。如果网络环境可以连接互联网,请直接按照本文的指导进行安装。 准备工作​ 请参考安装环境文档准备安装环境。 配置用户与安装目录。 在操作前请检查您是否有 sud

线性因子模型 - 独立分量分析(ICA)篇

序言 线性因子模型是数据分析与机器学习中的一类重要模型,它们通过引入潜变量( latent variables \text{latent variables} latent variables)来更好地表征数据。其中,独立分量分析( ICA \text{ICA} ICA)作为线性因子模型的一种,以其独特的视角和广泛的应用领域而备受关注。 ICA \text{ICA} ICA旨在将观察到的复杂信号

【软考】希尔排序算法分析

目录 1. c代码2. 运行截图3. 运行解析 1. c代码 #include <stdio.h>#include <stdlib.h> void shellSort(int data[], int n){// 划分的数组,例如8个数则为[4, 2, 1]int *delta;int k;// i控制delta的轮次int i;// 临时变量,换值int temp;in

三相直流无刷电机(BLDC)控制算法实现:BLDC有感启动算法思路分析

一枚从事路径规划算法、运动控制算法、BLDC/FOC电机控制算法、工控、物联网工程师,爱吃土豆。如有需要技术交流或者需要方案帮助、需求:以下为联系方式—V 方案1:通过霍尔传感器IO中断触发换相 1.1 整体执行思路 霍尔传感器U、V、W三相通过IO+EXIT中断的方式进行霍尔传感器数据的读取。将IO口配置为上升沿+下降沿中断触发的方式。当霍尔传感器信号发生发生信号的变化就会触发中断在中断

kubelet组件的启动流程源码分析

概述 摘要: 本文将总结kubelet的作用以及原理,在有一定基础认识的前提下,通过阅读kubelet源码,对kubelet组件的启动流程进行分析。 正文 kubelet的作用 这里对kubelet的作用做一个简单总结。 节点管理 节点的注册 节点状态更新 容器管理(pod生命周期管理) 监听apiserver的容器事件 容器的创建、删除(CRI) 容器的网络的创建与删除

PostgreSQL核心功能特性与使用领域及场景分析

PostgreSQL有什么优点? 开源和免费 PostgreSQL是一个开源的数据库管理系统,可以免费使用和修改。这降低了企业的成本,并为开发者提供了一个活跃的社区和丰富的资源。 高度兼容 PostgreSQL支持多种操作系统(如Linux、Windows、macOS等)和编程语言(如C、C++、Java、Python、Ruby等),并提供了多种接口(如JDBC、ODBC、ADO.NET等

OpenCV结构分析与形状描述符(11)椭圆拟合函数fitEllipse()的使用

操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C++11 算法描述 围绕一组2D点拟合一个椭圆。 该函数计算出一个椭圆,该椭圆在最小二乘意义上最好地拟合一组2D点。它返回一个内切椭圆的旋转矩形。使用了由[90]描述的第一个算法。开发者应该注意,由于数据点靠近包含的 Mat 元素的边界,返回的椭圆/旋转矩形数据