在iOS中,整個(gè)view都是直接構(gòu)建在Core Animation層之上。每個(gè)UIView實(shí)例都帶有一個(gè)CALayer實(shí)例啰劲,用來(lái)管理布局屬性,即所有用戶可見(jiàn)的部分檀何,都是由CALayer來(lái)提供的蝇裤,而UIView只是封裝了CALayer,在它之上添加了響應(yīng)事件的能力频鉴。
CALayer坐標(biāo)系統(tǒng)
在layer中栓辜,有以下四種屬性:bounds、frame垛孔、anchorPoint藕甩、position,他們的關(guān)系如下圖:
bounds是用來(lái)表示layer內(nèi)部坐標(biāo)位置的周荐,frame是相對(duì)于父layer的位置狭莱,若它為view的第一層layer,那么這個(gè)位置是相對(duì)于父view的概作。anchorPoint是用來(lái)影響變形動(dòng)畫的一個(gè)值腋妙,在view的左上角為(0, 0),右下角為(1, 1)仆嗦,默認(rèn)為(0.5, 0.5)辉阶,在view的中心。變形動(dòng)畫,比如旋轉(zhuǎn)谆甜,會(huì)繞著這個(gè)點(diǎn)來(lái)進(jìn)行垃僚。position是anchorPoint的位置,如果layer不動(dòng)规辱,anchorPoint的值改變谆棺,也會(huì)改變position的位置。
不同類型的layer
Core Animation定義了許多種不同的layer罕袋,上表中的每種layer都繼承自CALayer類改淑,在view中默認(rèn)提供的layer即CALayer,可以通過(guò)繼承UIView并重寫layerClass方法來(lái)定義不同的layer浴讯,當(dāng)然朵夏,也可以通過(guò)添加sublayer來(lái)在UIView中增加其它種類的layer。
給layer添加動(dòng)畫
layer動(dòng)畫分為顯式動(dòng)畫和隱式動(dòng)畫兩種榆纽,顯式動(dòng)畫通過(guò)生成一個(gè)CAAnimation類仰猖,顯式的添加到layer上來(lái)實(shí)現(xiàn),隱式動(dòng)畫通過(guò)直接給layer的屬性賦值來(lái)實(shí)現(xiàn)奈籽,比如:
theLayer.opacity = 0.0;
這就聲明了一個(gè)隱式動(dòng)畫饥侵,默認(rèn)的動(dòng)畫時(shí)長(zhǎng)為0.25秒。
顯式動(dòng)畫可以定義動(dòng)畫的路徑衣屏、開(kāi)始值躏升、結(jié)束值、持續(xù)時(shí)間狼忱、重復(fù)次數(shù)等膨疏,生成的實(shí)例添加到layer上就開(kāi)始執(zhí)行動(dòng)畫。動(dòng)畫在結(jié)束后返回layer的原狀態(tài)藕赞,可以在addAnimation之后修改layer的屬性來(lái)讓它保持動(dòng)畫結(jié)束的狀態(tài)成肘,或者變換其他狀態(tài)。也可以用CAKeyFrameAnimation來(lái)實(shí)現(xiàn)指定路徑的動(dòng)畫:
不同的動(dòng)畫可以組合成一個(gè)CAAnimationGroup斧蜕,可以同時(shí)執(zhí)行,實(shí)現(xiàn)復(fù)雜的動(dòng)畫砚偶,比如在大小改變的同時(shí)改變顏色等批销。CAAnimation也可以設(shè)置delegate,用來(lái)在動(dòng)畫開(kāi)始和結(jié)束時(shí)回調(diào)染坯。