Quarzt2D峻堰、CALayer與核心動畫
-
什么是Quarzt2D?
Quartz 2D是一個(gè)二維繪圖引擎旦万,同時(shí)支持iOS和Mac系統(tǒng)
Quartz2D的API是純C語言的
lQuartz2D的API來自于Core Graphics框架
數(shù)據(jù)類型和函數(shù)基本都以CG作為前綴
CGContextRef
CGPathRef
CGContextStrokePath(ctx);
……
?
Quartz 2D能完成的工作
- ?繪制圖形 : 線條\三角形\矩形\圓\弧等
- 繪制文字
- 繪制\生成圖片(圖像)
? * 讀取\生成PDF
? * 截圖\裁剪圖片
? 自定義UI控件
利用Quarzt2D自定義控件
圖形上下文
- 是一個(gè)CGContextRef類型的數(shù)據(jù)
- 作用
- 保存繪圖信息成艘、繪圖狀態(tài)
- 決定繪制的輸出目標(biāo)
類型
BitmapGraphics Context
PDFGraphics Context
WindowGraphics Context
LayerGraphics Context
PrinterGraphics Context
自定義view
首先贺归,得有圖形上下文拂酣,因?yàn)樗鼙4胬L圖信息,并且決定著繪制到什么地方去
其次丹莲,那個(gè)圖形上下文必須跟view相關(guān)聯(lián)尸诽,才能將內(nèi)容繪制到view上面
步驟
? 1.新建一個(gè)類盯另,繼承自UIView
? 2.實(shí)現(xiàn)-(void)drawRect:(CGRect)rect方法鸳惯,然后在這個(gè)方法中
? (1)取得跟當(dāng)前view相關(guān)聯(lián)的圖形上下文
? (2)繪制相應(yīng)的圖形內(nèi)容
? (3)利用圖形上下文將繪制的所有內(nèi)容渲染顯示到view上面
drawRect:
? 1.為什么要實(shí)現(xiàn)drawRect:方法才能繪圖到view上叠萍?
? 因?yàn)樵赿rawRect:方法中才能取得跟view相關(guān)聯(lián)的圖形上下文
? 2.方法在什么時(shí)候被調(diào)用苛谷?
? 當(dāng)view第一次顯示到屏幕上時(shí)(被加到UIWindow上顯示出來)
? 調(diào)用view的setNeedsDisplay或者setNeedsDisplayInRect:時(shí)
在drawRect:方法中取得上下文后格郁,就可以繪制東西到view上
View內(nèi)部有個(gè)layer(圖層)屬性,drawRect:方法中取得的是一個(gè) LayerGraphicsContext锣尉,因此决采,繪制的東西其實(shí)是繪制到view的layer上去了
View之所以能顯示東西树瞭,完全是因?yàn)樗鼉?nèi)部的layer
一般步驟
1.獲得圖形上下文
CGContextRefctx = UIGraphicsGetCurrentContext();
2.拼接路徑(以下代碼是畫一條線段)
CGContextMoveToPoint(ctx, 10, 10);
CGContextAddLineToPoint(ctx, 100, 100);
3.繪制路徑
CGContextStrokePath(ctx);
CALayer
CALayer的認(rèn)識和基本屬性
在iOS中,你能看得見摸得著的東西基本上都是UIView旺嬉,比如一個(gè)按鈕厨埋、一個(gè)文本標(biāo)簽荡陷、一個(gè)文本輸入框、一個(gè)圖標(biāo)等等徽龟,這些都是UIView
其實(shí)UIView之所以能顯示在屏幕上唉地,完全是因?yàn)樗鼉?nèi)部的一個(gè)圖層
在創(chuàng)建UIView對象時(shí)耘沼,UIView內(nèi)部會自動創(chuàng)建一個(gè)圖層(即CALayer對象),通過UIView的layer屬性可以訪問這個(gè)層
@property(nonatomic,readonly,retain)CALayer*layer;
當(dāng)UIView需要顯示到屏幕上時(shí)菠隆,會調(diào)用drawRect:方法進(jìn)行繪圖,并且會將所有內(nèi)容繪制在自己的圖層上躯肌,繪圖完畢后破衔,系統(tǒng)會將圖層拷貝到屏幕上,于是就完成了UIView的顯示
換句話說嫡丙,UIView本身不具備顯示的功能传惠,是它內(nèi)部的層才有顯示功能
注意點(diǎn):
? 首先
? CALayer是定義在QuartzCore框架中的
? CGImageRef卦方、CGColorRef兩種數(shù)據(jù)類型是定義在CoreGraphics框架中的
? UIColor、UIImage是定義在UIKit框架中的
? 其次
? QuartzCore框架和CoreGraphics框架是可以跨平臺使用的尘吗,在iOS和Mac OS X上都能使用
? 但是UIKit只能在iOS中使用
為了保證可移植性浇坐,QuartzCore不能使用UIImage近刘、UIColor,只能使用CGImageRef介劫、CGColorRef
? 屬性
寬度和高度
? @propertyCGRectbounds;
位置(默認(rèn)指中點(diǎn)案淋,具體由anchorPoint決定)
? @propertyCGPointposition;
錨點(diǎn)(x,y的范圍都是0-1)踢京,決定了position的含義
@propertyCGPointanchorPoint;
背景顏色(CGColorRef類型)
@propertyCGColorRefbackgroundColor;
形變屬性
@propertyCATransform3Dtransform;
邊框顏色(CGColorRef類型)
@propertyCGColorRefborderColor;
邊框?qū)挾?br> @propertyCGFloatborderWidth;
圓角半徑
@propertyCGColorRefborderColor;
內(nèi)容(比如設(shè)置為圖片CGImageRef)
@property(retain)idcontents;
作用
給圖層添加動畫,來實(shí)現(xiàn)一些比較炫酷的效果
通過操作CALayer對象黔帕,可以很方便地調(diào)整UIView的一些外觀屬性旨涝,比如:
陰影
圓角大小
邊框?qū)挾群皖伾?br>
… …
UIView與CALayer的選擇
其實(shí)白华,對比CALayer,UIView多了一個(gè)事件處理的功能厦取。也就是說管搪,CALayer不能處理用戶的觸摸事件更鲁,而UIView可以
所以,如果顯示出來的東西需要跟用戶進(jìn)行交互的話漂坏,用UIView媒至;如果不需要跟用戶進(jìn)行交互,用UIView或者CALayer都可以
當(dāng)然驯绎,CALayer的性能會高一些谋旦,因?yàn)樗倭耸录幚淼墓δ懿嶙牛虞p量級
隱式動畫
每一個(gè)UIView內(nèi)部都默認(rèn)關(guān)聯(lián)著一個(gè)CALayer,我們可用稱這個(gè)Layer為Root Layer(根層)
所有的非RootLayer乞巧,也就是手動創(chuàng)建的CALayer對象摊鸡,都存在著隱式動畫
什么是隱式動畫免猾?
當(dāng)對非RootLayer的部分屬性進(jìn)行修改時(shí),默認(rèn)會自動產(chǎn)生一些動畫效果
而這些屬性稱為AnimatableProperties(可動畫屬性)
列舉幾個(gè)常見的AnimatableProperties:
bounds:用于設(shè)置CALayer的寬度和高度获三。修改這個(gè)屬性會產(chǎn)生縮放動畫
backgroundColor:用于設(shè)置CALayer的背景色疙教。修改這個(gè)屬性會產(chǎn)生背景色的漸變動畫
position:用于設(shè)置CALayer的位置。修改這個(gè)屬性會產(chǎn)生平移動畫
核心動畫
Core Animation
Core Animation限佩,中文翻譯為核心動畫裸弦,它是一組非常強(qiáng)大的動畫處理API,使用它能做出非常炫麗的動畫效果晕城,而且往往是事半功倍砖顷。也就是說主之,使用少量的代碼就可以實(shí)現(xiàn)非常強(qiáng)大的功能槽奕。
Core Animation可以用在Mac OS X和iOS平臺。
Core Animation的動畫執(zhí)行過程都是在后臺操作的所森,不會阻塞主線程夯接。
要注意的是,Core Animation是直接作用在CALayer上的晴弃,并非UIView上鞠。
使用步驟
首先得有CALaye
初始化一個(gè)CAAnimation對象芍阎,并設(shè)置一些動畫相關(guān)屬性
通過調(diào)用CALayer的addAnimation:forKey:方法缨恒,增加CAAnimation對象到CALayer中轮听,這樣就能開始執(zhí)行動畫了
通過調(diào)用CALayer的removeAnimationForKey:方法可以停止CALayer中的動畫
CAAnimation屬性及使用注意點(diǎn)
所有動畫對象的父類血巍,負(fù)責(zé)控制動畫的持續(xù)時(shí)間和速度驼唱,是個(gè)抽象類玫恳,不能直接使用优俘,應(yīng)該使用它具體的子類
屬性說明:(來自CAMediaTiming協(xié)議的屬性)
? duration:動畫的持續(xù)時(shí)間
? repeatCount:重復(fù)次數(shù)帆焕,無限循環(huán)可以設(shè)置HUGE_VALF或者M(jìn)AXFLOAT
? repeatDuration:重復(fù)時(shí)間
? removedOnCompletion:默認(rèn)為YES,代表動畫執(zhí)行完畢后就從圖層上移除财饥,圖形會恢復(fù)到動畫執(zhí)行前的狀態(tài)折晦。如果想讓圖層保持顯示動畫執(zhí)行后的狀態(tài)满着,那就設(shè)置為NO,不過還要設(shè)置fillMode為kCAFillModeForwards
fillMode:決定當(dāng)前對象在非active時(shí)間段的行為宁改。比如動畫開始之前或者動畫結(jié)束之后
beginTime:可以用來設(shè)置動畫延遲執(zhí)行時(shí)間还蹲,若想延遲2s耙考,就設(shè)置為CACurrentMediaTime()+2,CACurrentMediaTime()為圖層的當(dāng)前時(shí)間
?
timingFunction:速度控制函數(shù)锅论,控制動畫運(yùn)行的節(jié)奏
delegate:動畫代理
CAPropertyAnimation
是CAAnimation的子類最易,也是個(gè)抽象類,要想創(chuàng)建動畫對象剔猿,應(yīng)該使用它的兩個(gè)子類:
CABasicAnimation
基本動畫嬉荆,是CAPropertyAnimation的子類
屬性說明:
?fromValue:keyPath相應(yīng)屬性的初始值
?toValue:keyPath相應(yīng)屬性的結(jié)束值
?動畫過程說明:
隨著動畫的進(jìn)行鄙早,在長度為duration的持續(xù)時(shí)間內(nèi),keyPath相應(yīng)屬性的值 從fromValue漸漸地變?yōu)閠oValue
?keyPath內(nèi)容是CALayer的可動畫Animatable屬性
如果fillMode=kCAFillModeForwards同時(shí)removedOnComletion=NO舱污,那么在動畫執(zhí)行完畢后弥虐,圖層會保持顯示動畫執(zhí)行后的狀態(tài)霜瘪。但在實(shí)質(zhì)上,圖層的屬性值還是動畫執(zhí)行前的初始值捻撑,并沒有真正被改變布讹。
CAKeyframeAnimation
關(guān)鍵幀動畫训堆,也是CAPropertyAnimation的子類坑鱼,與CABasicAnimation的區(qū)別是:
CABasicAnimation只能從一個(gè)數(shù)值(fromValue)變到另一個(gè)數(shù)值(toValue),而CAKeyframeAnimation會使用一個(gè)NSArray保存這些數(shù)值
屬性說明:
values:上述的NSArray對象呼股。里面的元素稱為“關(guān)鍵幀”(keyframe)画恰。動畫對象會在指定的時(shí)間(duration)內(nèi)允扇,依次顯示values數(shù)組中的每一個(gè)關(guān)鍵幀
path:可以設(shè)置一個(gè)CGPathRef则奥、CGMutablePathRef读处,讓圖層按照路徑軌跡移動唱矛。path只對CALayer的anchorPoint和position起作用绎谦。如果設(shè)置了path,那么values將被忽略
keyTimes:可以為對應(yīng)的關(guān)鍵幀指定對應(yīng)的時(shí)間點(diǎn)渐北,其取值范圍為0到1.0,keyTimes中的每一個(gè)時(shí)間值都對應(yīng)values中的每一幀恃锉。如果沒有設(shè)置keyTimes破托,各個(gè)關(guān)鍵幀的時(shí)間是平分的
CABasicAnimation可看做是只有2個(gè)關(guān)鍵幀的CAKeyframeAnimation
屬性說明:
keyPath:通過指定CALayer的一個(gè)屬性名稱為keyPath(NSString類型)土砂,并且對CALayer的這個(gè)屬性的值進(jìn)行修改,達(dá)到相應(yīng)的動畫效果吴叶。比如序臂,指定@“position”為keyPath奥秆,就修改CALayer的position屬性的值,以達(dá)到平移的動畫效果
?
CAAnimationGroup——動畫組
動畫組侮叮,是CAAnimation的子類悼瘾,可以保存一組動畫對象,將CAAnimationGroup對象加入層后歹嘹,組中所有動畫對象可以同時(shí)并發(fā)運(yùn)行
屬性說明:
animations:用來保存一組動畫對象的NSArray
默認(rèn)情況下尺上,一組動畫對象是同時(shí)運(yùn)行的圆到,也可以通過設(shè)置動畫對象的beginTime屬性來更改動畫的開始時(shí)間
轉(zhuǎn)場動畫——CATransition
CATransition是CAAnimation的子類,用于做轉(zhuǎn)場動畫芽淡,能夠?yàn)閷犹峁┮瞥銎聊缓鸵迫肫聊坏膭赢嬓Ч砭OS比Mac OS X的轉(zhuǎn)場動畫效果少一點(diǎn)
UINavigationController就是通過CATransition實(shí)現(xiàn)了將控制器的視圖推入屏幕的動畫效果
動畫屬性:
type:動畫過渡類型
subtype:動畫過渡方向
startProgress:動畫起點(diǎn)(在整體動畫的百分比)
endProgress:動畫終點(diǎn)(在整體動畫的百分比)