下圖描繪了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)用。