IOS開發(fā)-CALayer和UIView的理解

1. ? ?CALayer和UIView之間的關(guān)系:

?在iOS系統(tǒng)中福荸,你能看得見摸得著的東西基本上都是UIView,比如UI控件、圖標等等姓迅,都是UIView。

?其實UIView之所以能顯示在屏幕上,完全是因為它內(nèi)部的一個層(CALayer)丁存。

?在創(chuàng)建UIView對象時肩杈,UIView內(nèi)部會自動創(chuàng)建一個層(即CALayer對象),通過UIView的layer屬性可以訪問這個層解寝。當UIView需要顯示到屏幕上時扩然,會調(diào)用drawRect:方法進行繪圖,并且會將所有內(nèi)容繪制在自己的層上聋伦,繪圖完畢后夫偶,系統(tǒng)會將層拷貝到屏幕上,于是就完成了UIView的顯示觉增。

?換句話說兵拢,UIView本身不具備顯示的功能,是它內(nèi)部的層才有顯示功能逾礁。

UIView之所以能夠顯示说铃,完全是因為內(nèi)部的CALayer對象。因此嘹履,通過操作這個CALayer對象截汪,可以很方便地調(diào)整UIView的一些界面屬性,比如:陰影植捎、圓角大小衙解、邊框?qū)挾群皖伾取?/b>

UIView相對于CALayer來說就是多一個事件處理的功能,CALayer是不能處理用戶的觸摸事件焰枢。故如果顯示出來的東西需要跟用戶進行交互的話蚓峦,用UIView;如果不需要跟用戶進行交互济锄,用UIView或者CALayer都可以暑椰。

2.為什么CALayer中使用CGColorRef和CGImageRef這2種數(shù)據(jù)類型,而不用UIColor和UIImage荐绝?

* 首先要知道:CALayer是定義在QuartzCore框架中的一汽;CGImageRef、CGColorRef兩種數(shù)據(jù)類型是定義在CoreGraphics框架中的低滩;UIColor召夹、UIImage是定義在UIKit框架中的

* 其次,QuartzCore框架和CoreGraphics框架是可以跨平臺使用的恕沫,在iOS和Mac OS X上都能使用监憎,但是UIKit只能在iOS中使用

* 因此,為了保證可移植性婶溯,QuartzCore不能使用UIImage鲸阔、UIColor偷霉,只能使用CGImageRef、CGColorRef

* 不過很多情況下褐筛,可以通過UIKit對象的特定方法类少,得到CoreGraphics對象,比如UIImage的CGImage方法可以返回一個CGImageRef

3.UIView的顯示過程

?1. ? 當UIView需要顯示時渔扎,它內(nèi)部的層會準備好一個CGContextRef(圖形上下文)瞒滴,然后調(diào)用delegate(這里就是UIView)的drawLayer:inContext:方法,并且傳入已經(jīng)準備好的CGContextRef對象赞警。而UIView在drawLayer:inContext:方法中又會調(diào)用自己的drawRect:方法

? ?2. ?在drawRect:中通過UIGraphicsGetCurrentContext()獲取的就是由層傳入的CGContextRef對象妓忍,在drawRect:中完成的所有繪圖都會填入層的CGContextRef中,然后被拷貝至屏幕

(1).新建一個繼承于CALayer的類AACALayer愧旦,然后覆蓋drawInContext:方法世剖,在里面繪圖

-(void)drawInContext:(CGContextRef)abc{

?? ? CGContextSetRGBFillColor(abc,0, 1, 0.5, 1);//填充,出現(xiàn)實心

??//? ? 起點

?? ? CGContextMoveToPoint(abc,50, 0);

? // 從(50, 0)連線到(0, 100)

?? ? CGContextAddLines(abc,0, 100);

?// 從(0, 100)連線到(100, 100)

? ? CGContextAddLineToPoint(abc,100, 100);

?//? ? 繪制路徑

?? ? CGContextClosePath(abc);

?? }

(2).不想寫子類笤虫,也可以直接使用代理可以新建層旁瘫,drawLayer:(CALayer *)layer inContext:(CGContextRef)ctx中繪圖,但是不能將UIView設(shè)置為它的代理琼蚯,否則和UIView內(nèi)部就沖突了酬凳,因為UIView已經(jīng)是內(nèi)部根圖層的degegate了。

-(void)viewDidLoad{

? ? CALayer *layerr = [CALayer layer];

?? ? // 設(shè)置層的寬高

?? layerr.bounds = CGRectMake(0, 0, 100, 100);

?? // 設(shè)置層的位置

?? layerr.position = CGPointMake(100, 100);

?? laere.delegate - self;

?? // 開始繪制圖層

?? [layer setNeedsDisplay];//無論采取哪種方法來自定義層遭庶,都必須調(diào)用CALayer的setNeedsDisplay方法才能正常繪圖宁仔。

? ? [self.view.layer addSublayer:layer];

?? }

//在代理方法中

?- (void)drawLayer:(CALayer *)layer inContext:(CGContextRef)ctx {

? ? ? CGContextSetRGBStrokeColor(ctx,0, 0, 1, 1);//這不填充,空心

?? ? CGContextSetLineWidth(ctx,5);

?? ? CGContextAddRect(ctx, layer.bounds);

?? ? CGContextStrokePath(ctx);

}

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末峦睡,一起剝皮案震驚了整個濱河市翎苫,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌榨了,老刑警劉巖煎谍,帶你破解...
    沈念sama閱讀 216,591評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異龙屉,居然都是意外死亡呐粘,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,448評論 3 392
  • 文/潘曉璐 我一進店門转捕,熙熙樓的掌柜王于貴愁眉苦臉地迎上來作岖,“玉大人,你說我怎么就攤上這事瓜富△⒃郏” “怎么了降盹?”我有些...
    開封第一講書人閱讀 162,823評論 0 353
  • 文/不壞的土叔 我叫張陵与柑,是天一觀的道長谤辜。 經(jīng)常有香客問我,道長价捧,這世上最難降的妖魔是什么丑念? 我笑而不...
    開封第一講書人閱讀 58,204評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮结蟋,結(jié)果婚禮上脯倚,老公的妹妹穿的比我還像新娘。我一直安慰自己嵌屎,他們只是感情好推正,可當我...
    茶點故事閱讀 67,228評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著宝惰,像睡著了一般植榕。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上尼夺,一...
    開封第一講書人閱讀 51,190評論 1 299
  • 那天尊残,我揣著相機與錄音,去河邊找鬼淤堵。 笑死寝衫,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的拐邪。 我是一名探鬼主播慰毅,決...
    沈念sama閱讀 40,078評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼扎阶!你這毒婦竟也來了事富?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,923評論 0 274
  • 序言:老撾萬榮一對情侶失蹤乘陪,失蹤者是張志新(化名)和其女友劉穎统台,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體啡邑,經(jīng)...
    沈念sama閱讀 45,334評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡贱勃,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,550評論 2 333
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了谤逼。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片贵扰。...
    茶點故事閱讀 39,727評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖流部,靈堂內(nèi)的尸體忽然破棺而出戚绕,到底是詐尸還是另有隱情,我是刑警寧澤枝冀,帶...
    沈念sama閱讀 35,428評論 5 343
  • 正文 年R本政府宣布舞丛,位于F島的核電站耘子,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏球切。R本人自食惡果不足惜谷誓,卻給世界環(huán)境...
    茶點故事閱讀 41,022評論 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望吨凑。 院中可真熱鬧捍歪,春花似錦、人聲如沸鸵钝。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,672評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽恩商。三九已至弓摘,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間痕届,已是汗流浹背韧献。 一陣腳步聲響...
    開封第一講書人閱讀 32,826評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留研叫,地道東北人锤窑。 一個月前我還...
    沈念sama閱讀 47,734評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像嚷炉,于是被迫代替她去往敵國和親渊啰。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,619評論 2 354

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

  • 在iOS中隨處都可以看到絢麗的動畫效果申屹,實現(xiàn)這些動畫的過程并不復(fù)雜绘证,今天將帶大家一窺iOS動畫全貌。在這里你可以看...
    F麥子閱讀 5,110評論 5 13
  • 在iOS中隨處都可以看到絢麗的動畫效果哗讥,實現(xiàn)這些動畫的過程并不復(fù)雜嚷那,今天將帶大家一窺ios動畫全貌。在這里你可以看...
    每天刷兩次牙閱讀 8,485評論 6 30
  • 1 CALayer IOS SDK詳解之CALayer(一) http://doc.okbase.net/Hell...
    Kevin_Junbaozi閱讀 5,148評論 3 23
  • CALayer1-簡介 本文目錄 一杆煞、什么是CALayer 二魏宽、CALayer的簡單使用 回到頂部 一、什么是CA...
    白水灬煮一切閱讀 2,586評論 0 8
  • 1决乎、什么是CALayer队询? 在創(chuàng)建UIView對象時,UIView內(nèi)部會自動創(chuàng)建一個層(即CALayer對象...
    與時間共舞閱讀 398評論 0 0