子類CALayer上自定義屬性改變執(zhí)行的動畫和對個人對動畫的理解

個人對動畫的理解:CALayer的屬性變化了拴签,如果添加了動畫事務(wù)运挫,就會在屏幕上顯現(xiàn)了動畫,而動畫的根本原理是亲配,當(dāng)你設(shè)置了動畫的fromValue尘应,duration等數(shù)據(jù)時候,其實(shí)是設(shè)置了CALayer的相應(yīng)屬性在presentationLayer的變化數(shù)據(jù)(變化需要的時間吼虎,變化的起始點(diǎn)等)犬钢,然后每次CALayer的相應(yīng)屬性變化,都會觸發(fā)drawInContex之類的繪圖方法中用新的相應(yīng)屬性值重新繪圖思灰。說白了:

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 動畫是CALayer屬性的變化數(shù)據(jù)玷犹。

所以形成動畫需要兩個要求:1.屬性有不斷變化的數(shù)據(jù);2.屬性可以在繪圖函數(shù)不斷被重新繪制洒疚。

注意:動畫跟修改CALayer內(nèi)部屬性逐漸變換是不一樣的歹颓,動畫修改的是presentationLayer的數(shù)據(jù),修改CALayer內(nèi)部屬性逐漸變換是修改modelLayer的數(shù)據(jù)油湖。presentationLayer 是CALayer眼睛看到屏幕上CALayer的位置巍扛,而實(shí)際上CALayer還在modelLayer位置上。這也就是為什么動畫結(jié)束后乏德,如果不使用下面的代碼电湘,CALayer還會回到原來位置,因?yàn)閙odelLayer的數(shù)據(jù)并沒有修改鹅经。所以使用下面代碼或者強(qiáng)制修改modelLayer的數(shù)據(jù)寂呛,CALayer就不會動畫結(jié)束后跳回去了。

animation.fillMode = kCAFillModeForward;

animation.removedOnCompletion =NO;

removedOnCompletion 表示動畫結(jié)束后是否要移除動畫瘾晃,NO表示不移除贷痪。

fillMode 表示動畫停止時,動畫展現(xiàn)在哪里蹦误,可以向前展現(xiàn)(動畫結(jié)束時)劫拢,向后展現(xiàn)(動畫開始時)肉津,或者兩者都是,或者默認(rèn)舱沧。

注意這個代碼并不是修改了modelLayer數(shù)據(jù)妹沙,它只是強(qiáng)制CALayer留在動畫最后,所以CALayer和CALayer所在的UIView在屏幕上所看到的位置并不能接收點(diǎn)擊事件熟吏。

子類CALayer自定義屬性的動畫:

1.子類CALayer的自定義屬性如果是CAShapeLayer距糖,改變CAShapeLayer進(jìn)行改變時,如縮放牵寺,旋轉(zhuǎn)等悍引,會自動動畫。CAShapeLayer是CALayer的一個子類帽氓,我們使用這個CAShapeLayer相當(dāng)于使用了CALayer趣斤,除了根圖層外,子圖層的屬性都會自動動畫黎休,這是隱式動畫浓领。

2.如果子類CALayer的自定義屬性是其他,如float(CALayer自定義屬性不能是對象势腮,否則需要下面注意的處理)等联贩,首先需要屏蔽掉float屬性的setter和getter(@dynamic),使用CALayer給float定義的setter方法(這個我們看不見)嫉鲸,然后使用+needsDisplayForKey方法撑蒜,告訴runtime這個float屬性改變時,需要重新調(diào)用CALayer的-display方法玄渗,此時修改float屬性 并不會觸發(fā)動畫(因?yàn)閒loat屬性并沒有設(shè)置動畫座菠,即變化數(shù)據(jù)),我們需要使用-(id)actionForKey:方法里面定義float的動畫(也就是上面說的float的變化數(shù)據(jù))藤树。這樣就實(shí)現(xiàn)了對一個子類CALayer自定義屬性的動畫浴滴,由此可以推測CALayer的屬性變化產(chǎn)生的動畫都是由-(id)actionForKey:來注冊,使用+needsDisplayForKey觸發(fā)display來更新幀岁钓。

注意:

在drawInContex之類的繪圖方法中升略,盡量避免CGContextDrawImageInRect之類的元繪圖調(diào)用,因?yàn)檫@些元繪圖操作非常耗時屡限,也是硬件加速幫不上忙的地方品嚣,盡量通過將CGImageRef傳給CALayer.contents屬性的方法把內(nèi)容事先做好傳給CALayer,然后通過仿射或者3D transform的方法來進(jìn)行動畫變換钧大,? 因?yàn)榉律浠蛘?D transform是完全硬件加速的翰撑,它比自己書寫繪圖代碼要快的多的多? 。

layer方法響應(yīng)鏈有三種:

1. [layer setNeedDisplay] -> [layer displayIfNeed] -> [layer display] -> [layerDelegate displayLayer:]

2. [layer setNeedDisplay] -> [layer displayIfNeed] -> [layer display] -> [layer drawInContext:] -> [layerDelegate drawLayer: inContext:]?

3.[layer setNeedDisplay] -> [layer displayIfNeed] -> [layer display] -> [layer drawInContext:] -> [layerDelegate drawRect:] (這個只有圖層樹的根圖層才有)

子類化CALayer時啊央,有個地方要注意眶诈,因?yàn)镃oreAnimation在生成中間幀的方式涨醋,是通過Copy操作生成了一大堆中間幀用的CALayer,它在復(fù)制CALayer的數(shù)據(jù)時逝撬,只能對CALayer原有的屬性成員進(jìn)行copy浴骂,不會copy后添加的諸如對象引用一類的東西,這就需要程序員重載(這也就是Layer 中自定義屬性的動畫這篇博文中宪潮,第二個例子不用NSDate的原因)

-?(id)initWithLayer:(id)layer

{

? ? ? ?self=?[super?initWithLayer:layer];

? ? ? ?if(self?!=?nil)?{

? ? ? ? ?MyLayer?*myLayer=?(MyLayer*)layer;

? ? ? ? self.aUIImage=cl.aUIImage;

? ? ? }

? ?return?(self);

}


引用文章:

CALayer的needsDisplayForKey方法使用說明

Layer 中自定義屬性的動畫

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末溯警,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子坎炼,更是在濱河造成了極大的恐慌愧膀,老刑警劉巖拦键,帶你破解...
    沈念sama閱讀 211,123評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件谣光,死亡現(xiàn)場離奇詭異,居然都是意外死亡芬为,警方通過查閱死者的電腦和手機(jī)萄金,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,031評論 2 384
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來媚朦,“玉大人氧敢,你說我怎么就攤上這事⊙牛” “怎么了孙乖?”我有些...
    開封第一講書人閱讀 156,723評論 0 345
  • 文/不壞的土叔 我叫張陵,是天一觀的道長份氧。 經(jīng)常有香客問我唯袄,道長,這世上最難降的妖魔是什么蜗帜? 我笑而不...
    開封第一講書人閱讀 56,357評論 1 283
  • 正文 為了忘掉前任恋拷,我火速辦了婚禮,結(jié)果婚禮上厅缺,老公的妹妹穿的比我還像新娘蔬顾。我一直安慰自己,他們只是感情好湘捎,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,412評論 5 384
  • 文/花漫 我一把揭開白布诀豁。 她就那樣靜靜地躺著,像睡著了一般窥妇。 火紅的嫁衣襯著肌膚如雪舷胜。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,760評論 1 289
  • 那天秩伞,我揣著相機(jī)與錄音逞带,去河邊找鬼欺矫。 笑死,一個胖子當(dāng)著我的面吹牛展氓,可吹牛的內(nèi)容都是我干的穆趴。 我是一名探鬼主播,決...
    沈念sama閱讀 38,904評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼遇汞,長吁一口氣:“原來是場噩夢啊……” “哼未妹!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起空入,我...
    開封第一講書人閱讀 37,672評論 0 266
  • 序言:老撾萬榮一對情侶失蹤络它,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后歪赢,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體化戳,經(jīng)...
    沈念sama閱讀 44,118評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,456評論 2 325
  • 正文 我和宋清朗相戀三年埋凯,在試婚紗的時候發(fā)現(xiàn)自己被綠了点楼。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,599評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡白对,死狀恐怖掠廓,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情甩恼,我是刑警寧澤蟀瞧,帶...
    沈念sama閱讀 34,264評論 4 328
  • 正文 年R本政府宣布,位于F島的核電站条摸,受9級特大地震影響悦污,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜屈溉,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,857評論 3 312
  • 文/蒙蒙 一塞关、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧子巾,春花似錦帆赢、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,731評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至仪搔,卻和暖如春瘾婿,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,956評論 1 264
  • 我被黑心中介騙來泰國打工偏陪, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留抢呆,地道東北人。 一個月前我還...
    沈念sama閱讀 46,286評論 2 360
  • 正文 我出身青樓笛谦,卻偏偏與公主長得像抱虐,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子饥脑,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,465評論 2 348

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

  • 在iOS中隨處都可以看到絢麗的動畫效果策菜,實(shí)現(xiàn)這些動畫的過程并不復(fù)雜疑枯,今天將帶大家一窺iOS動畫全貌。在這里你可以看...
    F麥子閱讀 5,101評論 5 13
  • 在iOS中隨處都可以看到絢麗的動畫效果祈噪,實(shí)現(xiàn)這些動畫的過程并不復(fù)雜锄弱,今天將帶大家一窺ios動畫全貌权纤。在這里你可以看...
    每天刷兩次牙閱讀 8,469評論 6 30
  • 如果想讓事情變得順利筑煮,只有靠自己--夏爾·紀(jì)堯姆 上一章介紹了隱式動畫的概念都毒。隱式動畫是在iOS平臺創(chuàng)建動態(tài)用戶界...
    夜空下最亮的亮點(diǎn)閱讀 1,933評論 0 1
  • 我一直以為所有的事情都會按照自己的想法走,所以自己為了心里的那一個夢不斷地做著椰弊,努力著许溅。 以為自己做了一個真實(shí)的夢...
    格利普閱讀 169評論 0 0
  • “爸爸媽媽吵架的時候,你是什么感覺茬祷?” “想死的感覺……” 這是父母與孩子間的真實(shí)對話清焕。 作為父母,我們了解多少這...
    麥肯兮君閱讀 523評論 3 0