Quarzt2D揭斧、CALayer與核心動畫

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)
屏幕快照 2017-06-06 15.23.14.png

類型
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上鞠。

屏幕快照 2017-06-06 15.53.39.png

使用步驟
首先得有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)(在整體動畫的百分比)

屏幕快照 2017-06-06 16.29.42.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市挣菲,隨后出現(xiàn)的幾起案子富稻,更是在濱河造成了極大的恐慌,老刑警劉巖白胀,帶你破解...
    沈念sama閱讀 218,858評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件椭赋,死亡現(xiàn)場離奇詭異,居然都是意外死亡或杠,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,372評論 3 395
  • 文/潘曉璐 我一進(jìn)店門向抢,熙熙樓的掌柜王于貴愁眉苦臉地迎上來认境,“玉大人,你說我怎么就攤上這事挟鸠〔嫘牛” “怎么了?”我有些...
    開封第一講書人閱讀 165,282評論 0 356
  • 文/不壞的土叔 我叫張陵兄猩,是天一觀的道長茉盏。 經(jīng)常有香客問我,道長枢冤,這世上最難降的妖魔是什么鸠姨? 我笑而不...
    開封第一講書人閱讀 58,842評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮淹真,結(jié)果婚禮上讶迁,老公的妹妹穿的比我還像新娘。我一直安慰自己核蘸,他們只是感情好巍糯,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,857評論 6 392
  • 文/花漫 我一把揭開白布啸驯。 她就那樣靜靜地躺著,像睡著了一般祟峦。 火紅的嫁衣襯著肌膚如雪罚斗。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,679評論 1 305
  • 那天宅楞,我揣著相機(jī)與錄音针姿,去河邊找鬼。 笑死厌衙,一個(gè)胖子當(dāng)著我的面吹牛距淫,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播婶希,決...
    沈念sama閱讀 40,406評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼榕暇,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了喻杈?” 一聲冷哼從身側(cè)響起彤枢,我...
    開封第一講書人閱讀 39,311評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎奕塑,沒想到半個(gè)月后堂污,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,767評論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡龄砰,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了讨衣。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片换棚。...
    茶點(diǎn)故事閱讀 40,090評論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖反镇,靈堂內(nèi)的尸體忽然破棺而出固蚤,到底是詐尸還是另有隱情,我是刑警寧澤歹茶,帶...
    沈念sama閱讀 35,785評論 5 346
  • 正文 年R本政府宣布夕玩,位于F島的核電站,受9級特大地震影響惊豺,放射性物質(zhì)發(fā)生泄漏燎孟。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,420評論 3 331
  • 文/蒙蒙 一尸昧、第九天 我趴在偏房一處隱蔽的房頂上張望揩页。 院中可真熱鬧,春花似錦烹俗、人聲如沸爆侣。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,988評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽兔仰。三九已至茫负,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間乎赴,已是汗流浹背忍法。 一陣腳步聲響...
    開封第一講書人閱讀 33,101評論 1 271
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留无虚,地道東北人缔赠。 一個(gè)月前我還...
    沈念sama閱讀 48,298評論 3 372
  • 正文 我出身青樓,卻偏偏與公主長得像友题,于是被迫代替她去往敵國和親嗤堰。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,033評論 2 355

推薦閱讀更多精彩內(nèi)容

  • 在iOS中隨處都可以看到絢麗的動畫效果度宦,實(shí)現(xiàn)這些動畫的過程并不復(fù)雜踢匣,今天將帶大家一窺ios動畫全貌。在這里你可以看...
    每天刷兩次牙閱讀 8,495評論 6 30
  • 在iOS中隨處都可以看到絢麗的動畫效果戈抄,實(shí)現(xiàn)這些動畫的過程并不復(fù)雜离唬,今天將帶大家一窺iOS動畫全貌。在這里你可以看...
    F麥子閱讀 5,113評論 5 13
  • 轉(zhuǎn)載:http://www.cnblogs.com/jingdizhiwa/p/5601240.html 1.ge...
    F麥子閱讀 1,544評論 0 1
  • 在iOS實(shí)際開發(fā)中常用的動畫無非是以下四種:UIView動畫划鸽,核心動畫输莺,幀動畫,自定義轉(zhuǎn)場動畫裸诽。 1.UIView...
    請叫我周小帥閱讀 3,101評論 1 23
  • 元認(rèn)知能力:對自己的思考過程的認(rèn)知與理解嫂用。以前我們做事可能只是簡單地做,以為自己知道了丈冬,沒有深入地去了解和探索嘱函,并...
    淇淇18閱讀 321評論 3 3