CALayer基礎(chǔ)

今天單純說(shuō)一下CALayer里面有的屬性和方法赘风。反正宗旨就是隨意社痛。
打開(kāi)CALayer定義文件:

@interface CALayer : NSObject <NSCoding, CAMediaTiming>
{
@private
  struct _CALayerIvars {
    int32_t refcount;
    uint32_t magic;
    void *layer;
#if TARGET_OS_MAC && !TARGET_RT_64_BIT
    void *unused1[8];
#endif
  } _attr;
}

/** Layer creation and initialization. **/

+ (instancetype)layer;

/* The designated initializer. */

- (instancetype)init;

- (instancetype)initWithLayer:(id)layer;

- (nullable id)presentationLayer;

- (id)modelLayer;

+ (nullable id)defaultValueForKey:(NSString *)key;

+ (BOOL)needsDisplayForKey:(NSString *)key;

- (BOOL)shouldArchiveValueForKey:(NSString *)key;

@property CGRect bounds;
...```

可以看到比較多的屬性和方法亚侠,挑一些方法和屬性來(lái)介紹一下滔悉。
***
先看看以下兩個(gè)方法:
  • (id)presentationLayer;
  • (id)modelLayer;```
    這兩個(gè)方法放在一起介紹,因?yàn)樗麄冎g是有關(guān)系锥腻。
    調(diào)用- (id)modelLayer返回的基本是當(dāng)前CALayer實(shí)例吠勘。其實(shí)這個(gè)就是你在代碼上修改的CALayer對(duì)象性芬,比如像這樣:
CALayer *layer = [CALayer layer];
layer.position = CGPointMake(10, 10);
...```
這里你可能改了很多l(xiāng)ayer的其他屬性,無(wú)論改了多少剧防,反正layer都幫你保存好了數(shù)據(jù)到堆里了植锉。也就是說(shuō)修改的`layer.position = CGPointMake(10, 10)`存到了modelLayer上了。
調(diào)用`- (id)presentationLayer`同樣也會(huì)返回CALayer實(shí)例(注意當(dāng)被顯示出來(lái)之后再調(diào)用才不會(huì)nil)峭拘,只不過(guò)這個(gè)實(shí)例不是你剛才在代碼上修改的那個(gè)layer了俊庇,而是屏幕上的layer的數(shù)據(jù),比如當(dāng)前屏幕上的`layer.position = CGPointMake(20, 20)`鸡挠,這里從原來(lái)modelLayer的position{10, 10}變成了presentationLayer的position{20, 20}辉饱。
那么問(wèn)題來(lái)了:
+ 為什么會(huì)多一個(gè)presentationLayer出來(lái)呢?有什么作用呢拣展?

先說(shuō)說(shuō)我們?cè)诖a上一般的做法彭沼。
比如我初始化了一個(gè)view出來(lái),大概是這樣的:

UIView *view = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 100, 100)];```
那么把他加到父view上去后备埃,這個(gè)view就會(huì)顯示在父view的{(0, 0), (100, 100)}的位置了溜腐。這個(gè)很好理解,因?yàn)槲乙潭ㄒ粋€(gè)view就必須指明他的坐標(biāo)位置和大小」侠現(xiàn)在我覺(jué)得這個(gè)view要向右過(guò)一點(diǎn)會(huì)看好一些,那么我們代碼大概是這么做的:

CGRect frame = view.frame;
frame.origin = CGPointMake(10, 0);
view.frame = frame;```
然后在屏幕上看到現(xiàn)在view比沒(méi)修改之前向右移動(dòng)了10歉糜,然后我覺(jué)得又要再向右過(guò)一點(diǎn)才好看乘寒,我重復(fù)之前的操作,大概是這么做的:

CGRect frame = view.frame;
frame.origin = CGPointMake(20, 0);
view.frame = frame;```
再然后我繼續(xù)任性匪补,重復(fù)每次增加10伞辛,去修改x烂翰,一共重復(fù)5次。最終修改成這樣:

CGRect frame = view.frame;
frame.origin = CGPointMake(50, 0);
view.frame = frame;```
好了蚤氏,現(xiàn)在后頭想甘耿,如果我修改的速度足夠快,每次看到屏幕上的view都向右移動(dòng)10竿滨,最終移動(dòng)到50的位置上佳恬,那么這個(gè)view看起來(lái)好像是在做動(dòng)畫(huà)一樣的移動(dòng)到50的位置上一樣。
如果不明白上面表達(dá)的意思的話于游,我想說(shuō)前面的字就用來(lái)充字?jǐn)?shù)的毁葱,其實(shí)簡(jiǎn)單的說(shuō)一句:`小時(shí)候,是否有試過(guò)在書(shū)上畫(huà)個(gè)小動(dòng)物贰剥,每一頁(yè)都畫(huà)得比前一頁(yè)稍微有那么一點(diǎn)的不同倾剿,畫(huà)得頁(yè)數(shù)足夠多之后,快速翻頁(yè)蚌成,可以看到這個(gè)畫(huà)出來(lái)的小動(dòng)物在動(dòng)了`前痘。在網(wǎng)上找了個(gè)效果[翻頁(yè)動(dòng)畫(huà)](http://tieba.baidu.com/p/1948629478)
相信讀者也明白是什么的一個(gè)效果了。現(xiàn)在來(lái)打個(gè)比喻担忧,如果這本書(shū)只有一頁(yè)畫(huà)了這個(gè)小動(dòng)物芹缔,你能看出他動(dòng)嗎?顯然不可以涵妥。那么很多張稍微不一樣的就能看出動(dòng)了乖菱,那是因?yàn)槟切┊?huà)面在人腦中留下的殘影(如果不明白這個(gè)的話,估計(jì)要問(wèn)問(wèn)學(xué)物理的還是化學(xué)的同學(xué)了吧)蓬网。
>屏幕上是怎么翻頁(yè)窒所,才能讓人類感動(dòng)畫(huà)的呢?可以閱讀[動(dòng)畫(huà)基礎(chǔ)](http://www.baidu.com)

對(duì)于程序也是一樣帆锋,你看到一個(gè)view在動(dòng)吵取,那是這個(gè)view位置在不斷的稍微變化,在你眼睛里留下的殘影锯厢。剛才說(shuō)了如果這本書(shū)只有一頁(yè)的話根本看不出動(dòng)畫(huà)來(lái)皮官,就好比如果只是設(shè)置了`frame.origin = CGPointMake(50, 0);`你就只會(huì)看到view被迅移到了x為50的位置上了。那個(gè)剛才是從10实辑,20捺氢,30,40剪撬,50這樣的移動(dòng)摄乒,只要足夠快,就可以看到動(dòng)起來(lái)了。
好了馍佑,關(guān)于
+ 為什么會(huì)多一個(gè)presentationLayer出來(lái)呢斋否?有什么作用呢?

這個(gè)問(wèn)題回答完了拭荤,就是因?yàn)樵谧鰟?dòng)畫(huà)的時(shí)候茵臭,需要把過(guò)渡的位置顯示出來(lái),而不是迅移舅世,人類眼睛留下了殘影才可以看到有動(dòng)畫(huà)旦委。所以需要一個(gè)presentationLayer來(lái)存放這些過(guò)渡的數(shù)據(jù),然后再這些過(guò)渡數(shù)據(jù)一個(gè)個(gè)渲染出來(lái)(其實(shí)就是每一幀)歇终。那么可以看出來(lái)presentationLayer是為做動(dòng)畫(huà)服務(wù)的(其實(shí)有沒(méi)為其他服務(wù)我就不知道了)社证。`所以假如在做動(dòng)畫(huà)的時(shí)候,presentationLayer里面的值就是當(dāng)前屏幕的值评凝;而modelLayer的值就是動(dòng)畫(huà)結(jié)束后的值`追葡。
>不知道是否會(huì)有讀者認(rèn)為老是說(shuō)一下CALayer又說(shuō)一下UIView?說(shuō)的都亂了奕短?可以閱讀[CALayer和UIView的關(guān)系](http://www.reibang.com/p/6351116c2d19)

***
再看這個(gè)方法:
  • (BOOL)needsDisplayForKey:(NSString *)key;```

再看這些屬性:

@property CGRect bounds;
@property CGPoint position;
@property CGFloat zPosition;
@property CGPoint anchorPoint;
@property CGFloat anchorPointZ;
@property CGRect frame;```
關(guān)于這些屬性宜肉,其實(shí)官方文檔都說(shuō)得很清楚了,看以下這張圖吧:
![Paste_Image.png](http://upload-images.jianshu.io/upload_images/1220247-5649867ee58b4c18.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
左邊的是iOS的翎碑,上圖展現(xiàn)了bounds谬返,frame,position日杈,anchorPoint遣铝,可以看到黃色矩形的左上角x和y在坐標(biāo)系上是{40, 60},但實(shí)際bounds的x和y是{0, 0}莉擒,那么可以得出一個(gè)結(jié)論是`bounds的x和y跟坐標(biāo)系位置無(wú)關(guān)`酿炸;又可以看到實(shí)際上`frame的x和y才是跟才是坐標(biāo)系的位置,bounds的width涨冀,height和frame的width填硕,height是一樣的`;anchorPoint點(diǎn)怎么理解呢鹿鳖?比較多的文章可能說(shuō)拿釘子釘一塊板到墻上的例子扁眯,不過(guò)我想說(shuō),旋轉(zhuǎn)木馬沒(méi)玩過(guò)也看過(guò)吧翅帜,就是一直圍繞著中心轉(zhuǎn)啊轉(zhuǎn)的木馬姻檀,anchorPoint就是這個(gè)選擇木馬圍繞中心旋轉(zhuǎn)的點(diǎn),其實(shí)就是`圓心的圓點(diǎn)(一個(gè)無(wú)限多邊形的圖形其實(shí)就是圓)涝滴,所以圖上的anchorPoint是{0.5, 0.5}剛好在中間(因?yàn)閍nchorPoint的x和y最大值分別都是1)`施敢;那么知道了anchorPoint周荐,position就好理解了,position就是`圓點(diǎn)在坐標(biāo)系上的坐標(biāo)`僵娃。
需要注意一下的是:`layer的frame比較特別,他是通過(guò)position, bounds腋妙,anchorPoint和transform共同計(jì)算出來(lái)的`默怨。什么意思呢?意思就是你`修改position, bounds骤素,anchorPoint和transform的值都會(huì)改變到frame`匙睹。在做動(dòng)畫(huà)的時(shí)候就要注意了,改變position, bounds济竹,anchorPoint和transform會(huì)導(dǎo)致frame的改變痕檬,可能就會(huì)出現(xiàn)你不想出現(xiàn)的情況,比如layer突然向上送浊,下梦谜,左,右迅移了袭景。
然后再來(lái)兩張圖:

![Paste_Image.png](http://upload-images.jianshu.io/upload_images/1220247-a90d1a00a3675bdc.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
![Paste_Image.png](http://upload-images.jianshu.io/upload_images/1220247-1a6f542347af6a08.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
第一張圖是一個(gè)UIView靜止的時(shí)候唁桩,第二張圖是UIView在做旋轉(zhuǎn)的時(shí)候,可以發(fā)現(xiàn)他們的frame不一樣了耸棒,明顯第二張圖變大了荒澡。這是因?yàn)檫@個(gè)UIView要保持矩形所以旋轉(zhuǎn)的時(shí)候就frame變大了。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末与殃,一起剝皮案震驚了整個(gè)濱河市单山,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌幅疼,老刑警劉巖米奸,帶你破解...
    沈念sama閱讀 222,000評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異衣屏,居然都是意外死亡躏升,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,745評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén)狼忱,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)膨疏,“玉大人,你說(shuō)我怎么就攤上這事钻弄〉枞矗” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 168,561評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵窘俺,是天一觀的道長(zhǎng)饲帅。 經(jīng)常有香客問(wèn)我复凳,道長(zhǎng),這世上最難降的妖魔是什么灶泵? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,782評(píng)論 1 298
  • 正文 為了忘掉前任育八,我火速辦了婚禮,結(jié)果婚禮上赦邻,老公的妹妹穿的比我還像新娘髓棋。我一直安慰自己,他們只是感情好惶洲,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,798評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布按声。 她就那樣靜靜地躺著,像睡著了一般恬吕。 火紅的嫁衣襯著肌膚如雪签则。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 52,394評(píng)論 1 310
  • 那天铐料,我揣著相機(jī)與錄音渐裂,去河邊找鬼。 笑死余赢,一個(gè)胖子當(dāng)著我的面吹牛芯义,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播妻柒,決...
    沈念sama閱讀 40,952評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼扛拨,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了举塔?” 一聲冷哼從身側(cè)響起绑警,我...
    開(kāi)封第一講書(shū)人閱讀 39,852評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎央渣,沒(méi)想到半個(gè)月后计盒,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,409評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡芽丹,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,483評(píng)論 3 341
  • 正文 我和宋清朗相戀三年北启,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片拔第。...
    茶點(diǎn)故事閱讀 40,615評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡咕村,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出蚊俺,到底是詐尸還是另有隱情懈涛,我是刑警寧澤,帶...
    沈念sama閱讀 36,303評(píng)論 5 350
  • 正文 年R本政府宣布泳猬,位于F島的核電站批钠,受9級(jí)特大地震影響宇植,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜埋心,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,979評(píng)論 3 334
  • 文/蒙蒙 一指郁、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧踩窖,春花似錦坡氯、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,470評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)手形。三九已至啥供,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間库糠,已是汗流浹背伙狐。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,571評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留瞬欧,地道東北人贷屎。 一個(gè)月前我還...
    沈念sama閱讀 49,041評(píng)論 3 377
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像艘虎,于是被迫代替她去往敵國(guó)和親唉侄。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,630評(píng)論 2 359

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

  • 在iOS中隨處都可以看到絢麗的動(dòng)畫(huà)效果野建,實(shí)現(xiàn)這些動(dòng)畫(huà)的過(guò)程并不復(fù)雜属划,今天將帶大家一窺ios動(dòng)畫(huà)全貌。在這里你可以看...
    每天刷兩次牙閱讀 8,514評(píng)論 6 30
  • 在iOS中隨處都可以看到絢麗的動(dòng)畫(huà)效果候生,實(shí)現(xiàn)這些動(dòng)畫(huà)的過(guò)程并不復(fù)雜同眯,今天將帶大家一窺iOS動(dòng)畫(huà)全貌。在這里你可以看...
    F麥子閱讀 5,115評(píng)論 5 13
  • 轉(zhuǎn)載:http://www.reibang.com/p/18c306333080 1.UIView與CALayer...
    F麥子閱讀 538評(píng)論 0 1
  • 轉(zhuǎn)載:http://www.reibang.com/p/32fcadd12108 每個(gè)UIView有一個(gè)伙伴稱為l...
    F麥子閱讀 6,220評(píng)論 0 13
  • 在iOS實(shí)際開(kāi)發(fā)中常用的動(dòng)畫(huà)無(wú)非是以下四種:UIView動(dòng)畫(huà)唯鸭,核心動(dòng)畫(huà)须蜗,幀動(dòng)畫(huà),自定義轉(zhuǎn)場(chǎng)動(dòng)畫(huà)目溉。 1.UIView...
    請(qǐng)叫我周小帥閱讀 3,112評(píng)論 1 23