iOS的UIView和CALayer

下圖描繪了CALayer和UIView的關(guān)系,在UIView中有一個layer屬性作為根圖層,根圖層上可以放其他子圖層,在UIView中所有能夠看到的內(nèi)容都包含在layer中:

UIView在顯示的時候(發(fā)生在ViewDidLoad之后)會創(chuàng)建自己的根圖層對象,根圖層對象會自動創(chuàng)建一個CGContextRef (CALayer 本質(zhì)使用的是位圖上下文),同時調(diào)用圖層代理(UIView創(chuàng)建圖層的同時會設(shè)置其代理為自身,所以UIView的它的CALayer對象的代理)的draw: inContext:方法并將圖形上下文作為參數(shù)傳遞給這個方法,而在UIView的draw:inContext:方法中會調(diào)用其drawRect:方法,在drawRect:方法中使用UIGraphicsGetCurrentContext()方法得到的上下文正是前面創(chuàng)建的上下文。

所以說在使用Quartz 2D在UIView中繪制圖形的本質(zhì)也是繪制到圖層中,它的根圖層

在CALayer中繪圖和在UIView中繪圖的區(qū)別是前面是繪制到了當(dāng)前的圖層,用UIView繪圖是繪制到了根圖層中,在子CALayer中繪圖的時候需要手動調(diào)用setNeedDisplay方法才會繪圖

在子CALayer中繪圖有兩種方法:

1.使用代理方法繪圖

通過代理方法進(jìn)行圖層繪圖只要指定圖層的代理,然后在代理對象中重寫-(void)drawLayer:(CALayer *)layer inContext:(CGContextRef)ctx方法即可。需要注意這個方法雖然是代理方法但是不用手動實(shí)現(xiàn)CALayerDelegate,因為CALayer定義中給NSObject做了分類擴(kuò)展,所有的NSObject都包含這個方法。另外設(shè)置完代理后必須要調(diào)用圖層的setNeedDisplay方法,否則繪制的內(nèi)容無法顯示。

2.使用自定義圖層繪圖

在自定義圖層中繪圖時只要自己編寫一個類繼承于CALayer然后在drawInContext:中繪圖即可。同前面在代理方法繪圖一樣,要顯示圖層中繪制的內(nèi)容也要調(diào)用圖層的setNeedDisplay方法,否則drawInContext方法將不會調(diào)用。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容