iOS總結(jié) CALayer 與 UIViwe

感覺自己學(xué)的東西很雜亂無章椿肩,iOS置逻、H5暴匠、小程序等等是時候分類梳理一下了精耐,要養(yǎng)成做筆記的習(xí)慣希太,以前一直這樣想克饶,從現(xiàn)在開始要行動起來!誊辉!不能懶了矾湃。

一 UIView 和 CALayer 的關(guān)系

  • 一個按鈕、一個輸入框堕澄、一張圖片等等都UIView邀跃。UIView是iOS系統(tǒng)中界面元素的基礎(chǔ),所有的界面元素都繼承自它蛙紫。

  • UIView之所以會顯示在屏幕上是因為它里邊有一個(CALayer),這個層是它的繪圖部分拍屑,里邊記錄了這個UIView的一些樣式屬性,UIVIew更像是一個CALayer的管理器坑傅,當(dāng)通過layer訪問它的屬性時僵驰,例如frame,其實都是在訪問它里邊CALayer的相關(guān)屬性唁毒。每當(dāng)UIView需要加載到屏幕上的時候蒜茴,會調(diào)用drawRect:方法把所有內(nèi)容繪制在CALayer上,然后系統(tǒng)把這個CALayer拷貝到屏幕上浆西,就完成了這個UIView的顯示粉私。

  • UIView自身不具備顯示功能,是因為內(nèi)部的層(CALayer)才有顯示的能力,而且這個默認的層不允許重新創(chuàng)建近零,但可以往層里面添加子層诺核,UIView可以通過addSubview:方法添加子視圖,類似地久信,CALayer可以通過addSublayer:方法添加子層

二 簡單運用

通過操作這個CALayer對象窖杀,可以很方便地調(diào)整UIView的一些界面屬性,比如:圓角大小入篮、邊框?qū)挾瘸率荨⒈尘邦伾取?/p>

設(shè)置陰影
 imageView.layer.shadowColor = [UIColor redColor].CGColor;//陰影的顏色
 imageView.layer.shadowOffset = CGSizeMake(5, 5);//偏移大小
 imageView.layer.shadowOpacity = 0.8; //透明度

圓角大小
imageView.layer.cornerRadius = 6;
imageView.layer.masksToBounds = YES; //強制內(nèi)部的所有子層支持圓角效果

邊框?qū)挾群皖伾?imageView.layer.borderWidth = 5;
imageView.layer.borderColor = [UIColor redColor].CGColor;

旋轉(zhuǎn)  (M_PI_4表示四分之π,順時針旋轉(zhuǎn)45°)  后面的(0, 0, 1) 表示Z軸這個向量(x,y,z) 效果就是Z軸順時針旋轉(zhuǎn)45°
imageView.layer.transform = CATransform3DMakeRotation(M_PI_4, 0, 0, 1);

  • UIView有一個layerClass方法,返回主layer所使用的類痊项,UIView的子類锅风,可以通過重載這個方法,來讓UIView使用不同的CALayer來顯示
- (class) layerClass {
  return ([CAEAGLLayer class]);
}
  • 當(dāng)然也可以向它的layer上添加子layer鞍泉,來完成某些特殊的表示皱埠。例
grayCover = [[CALayer alloc] init];
grayCover.backgroundColor = [[[UIColor blackColor] colorWithAlphaComponent:0.2] CGColor];
[self.layer addSubLayer: grayCover];
會在View上敷上一層黑色的透明薄膜。
  • 對比CALayer咖驮,UIView多了一個事件處理的功能边器。CALayer不能處理用戶的觸摸事件,而UIView可以托修,所以如果顯示出來的東西需要跟用戶進行事件處理用UIView忘巧,反之,用UIView或者CALayer都可以睦刃,當(dāng)然砚嘴,CALayer的性能會高一些,因為它少了事件處理的功能涩拙,更加輕量級际长。

  • UIView可以通過subviews屬性訪問所有的子視圖,類似地兴泥,CALayer也可以通過sublayers屬性訪問所有的子層

  • UIView可以通過superview屬性訪問父視圖工育,類似地,CALayer也可以通過superlayer屬性訪問父層

  • 兩個UIView是父子關(guān)系搓彻,那么它們內(nèi)部的CALayer也是父子關(guān)系如绸。

  • layer可以設(shè)置圓角顯示,例如UIButton的效果好唯,也可以設(shè)置陰影顯示竭沫,但是如果layer樹中的某個layer設(shè)置了圓角,樹中所有l(wèi)ayer的陰影效果都將顯示不了了骑篙。如果既想有圓角又想要陰影蜕提,好像只能做兩個重疊的UIView,一個的layer顯示圓角靶端,一個的layer顯示陰影.....

三 谎势、 總結(jié)

  • UIView的顯示過程:當(dāng)UIView需要顯示時,它內(nèi)部的層會準(zhǔn)備好一個CGContextRef(圖形上下文)杨名,然后調(diào)用delegate(這里就是UIView)的drawLayer:inContext:方法脏榆,并且傳入已經(jīng)準(zhǔn)備好的CGContextRef對象。而UIView在drawLayer:inContext:方法中又會調(diào)用自己的drawRect:方法
  • 平時在drawRect:中通過UIGraphicsGetCurrentContext()獲取的就是由層傳入的CGContextRef對象台谍,在drawRect:中完成的所有繪圖都會填入層的CGContextRef中须喂,然后被拷貝至屏幕
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子坞生,更是在濱河造成了極大的恐慌仔役,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,546評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件是己,死亡現(xiàn)場離奇詭異又兵,居然都是意外死亡,警方通過查閱死者的電腦和手機卒废,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,224評論 3 395
  • 文/潘曉璐 我一進店門沛厨,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人摔认,你說我怎么就攤上這事逆皮。” “怎么了级野?”我有些...
    開封第一講書人閱讀 164,911評論 0 354
  • 文/不壞的土叔 我叫張陵页屠,是天一觀的道長。 經(jīng)常有香客問我蓖柔,道長,這世上最難降的妖魔是什么风纠? 我笑而不...
    開封第一講書人閱讀 58,737評論 1 294
  • 正文 為了忘掉前任况鸣,我火速辦了婚禮,結(jié)果婚禮上竹观,老公的妹妹穿的比我還像新娘镐捧。我一直安慰自己,他們只是感情好臭增,可當(dāng)我...
    茶點故事閱讀 67,753評論 6 392
  • 文/花漫 我一把揭開白布懂酱。 她就那樣靜靜地躺著,像睡著了一般誊抛。 火紅的嫁衣襯著肌膚如雪列牺。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,598評論 1 305
  • 那天拗窃,我揣著相機與錄音瞎领,去河邊找鬼。 笑死随夸,一個胖子當(dāng)著我的面吹牛九默,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播宾毒,決...
    沈念sama閱讀 40,338評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼驼修,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起乙各,我...
    開封第一講書人閱讀 39,249評論 0 276
  • 序言:老撾萬榮一對情侶失蹤勉躺,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后觅丰,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體饵溅,經(jīng)...
    沈念sama閱讀 45,696評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,888評論 3 336
  • 正文 我和宋清朗相戀三年妇萄,在試婚紗的時候發(fā)現(xiàn)自己被綠了蜕企。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,013評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡冠句,死狀恐怖轻掩,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情懦底,我是刑警寧澤唇牧,帶...
    沈念sama閱讀 35,731評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站聚唐,受9級特大地震影響丐重,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜杆查,卻給世界環(huán)境...
    茶點故事閱讀 41,348評論 3 330
  • 文/蒙蒙 一扮惦、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧亲桦,春花似錦崖蜜、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,929評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至舔琅,卻和暖如春等恐,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背搏明。 一陣腳步聲響...
    開封第一講書人閱讀 33,048評論 1 270
  • 我被黑心中介騙來泰國打工鼠锈, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人星著。 一個月前我還...
    沈念sama閱讀 48,203評論 3 370
  • 正文 我出身青樓购笆,卻偏偏與公主長得像,于是被迫代替她去往敵國和親虚循。 傳聞我的和親對象是個殘疾皇子同欠,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,960評論 2 355

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

  • 在iOS中隨處都可以看到絢麗的動畫效果样傍,實現(xiàn)這些動畫的過程并不復(fù)雜,今天將帶大家一窺ios動畫全貌铺遂。在這里你可以看...
    每天刷兩次牙閱讀 8,495評論 6 30
  • 在iOS中隨處都可以看到絢麗的動畫效果衫哥,實現(xiàn)這些動畫的過程并不復(fù)雜,今天將帶大家一窺iOS動畫全貌襟锐。在這里你可以看...
    F麥子閱讀 5,113評論 5 13
  • 轉(zhuǎn)載:http://www.reibang.com/p/32fcadd12108 每個UIView有一個伙伴稱為l...
    F麥子閱讀 6,206評論 0 13
  • 每個UIView有一個伙伴稱為layer撤逢,一個CALayer。UIView實際上并沒有把自己畫到屏幕上;它繪制本身...
    shenzhenboy閱讀 3,109評論 0 17
  • CALayer1-簡介 本文目錄 一粮坞、什么是CALayer 二蚊荣、CALayer的簡單使用 回到頂部 一、什么是CA...
    白水灬煮一切閱讀 2,592評論 0 8