備註:CALayer是定義在QuartzCore框架中的;CGImageRef、CGColorRef兩種數據類型是定義在CoreGraphics框架中的;UIColor、UIImage是定義在UIKit框架中的框架
其次,QuartzCore框架和CoreGraphics框架是能夠跨平臺使用的,在iOS和Mac OS X上都能使用,可是UIKit只能在iOS中使用性能
所以,爲了保證可移植性,QuartzCore不能使用UIImage、UIColor,只能使用CGImageRef、CGColorRef動畫
不過不少狀況下,能夠經過UIKit對象的特定方法,獲得CoreGraphics對象,好比UIImage的CGImage方法能夠返回一個CGImageRefatom
UIView之因此能顯示在屏幕上,徹底是由於它內部的一個圖層,在建立UIView對象時,UIView內部會自動建立一個圖層(即CALayer對象),經過UIView的layer屬性能夠訪問這個層spa
@property(nonatomic,readonly,retain) CALayer *layer; 代理
當UIView須要顯示到屏幕上時,會調用drawRect:方法進行繪圖,而且會將全部內容繪製在本身的圖層上,繪圖完畢後,系統會將圖層拷貝到屏幕上,因而就完成了UIView的顯示orm
換句話說,UIView自己不具有顯示的功能,擁有顯示功能的是它內部的圖層。對象
三:使用繼承
經過操做這個CALayer對象,能夠很方便地調整UIView的一些界面屬性,好比:陰影、圓角大小、邊框寬度和顏色等。事件
1,經過layer設置邊框的寬度和顏色
self.layerView.layer.borderColor = [UIColor redColor].CGColor;
注意:這裏用CGColorRef
self.layerView.layer.borderWidth = 20;
self.layerView.layer.shadowColor = [UIColor blueColor].CGColor;
self.layerView.layer.shadowOffset = CGSizeMake(10, 10); // 偏移量
self.layerView.layer.shadowOpacity = 0.5; // 不透明度
4.設置內容
self.layerView.layer.contents = (id)[UIImage imageNamed:@"me"].CGImage;
注意:
1,layer中的圖片、設置顏色都是CG類型的。
2,image view、view中設置圓角不顯示的緣由:imageView中的圖片不是跟layer,須要將超出的部分切掉,設置它的masktobounds屬性,這樣陰影也會消失。
5,設置transform屬性(UIView的transform是2D效果,lay是3D效果)
self.layerView.layer.transform = CATransform3DMakeRotation(M_PI_4, 1, 1, 1);
kvc設置屬性值
NSValue *value = [NSValue valueWithCATransform3D:CATransform3DMakeRotation(M_PI_4, 1, 0, 0)];
[self.layerView.layer setValue:value forKeyPath:@"transform"];
對比CALayer,UIView多了一個事件處理的功能。也就是說,CALayer不能處理用戶的觸摸事件,而UIView能夠。
因此,在選擇的過程當中,須要考慮到實際的狀況,若是顯示出來的東西須要跟用戶進行交互的話,用UIView;若是不須要跟用戶進行交互,用UIView或者CALayer均可以
固然,CALayer的性能會高一些,由於它少了事件處理的功能,更加輕量級
每個UIView內部都默認關聯着一個CALayer,咱們可用稱這個Layer爲Root Layer(根層)
全部的非Root Layer,也就是手動建立的CALayer對象,都存在着隱式動畫
什麼是隱式動畫?
當對非Root Layer的部分屬性進行修改時,默認會自動產生一些動畫效果
而這些屬性稱爲Animatable Properties(可動畫屬性)
[CATransaction begin];
[CATransaction setDisableActions:YES];
在UIView中繪製圖形,獲取的上下文就是這個view對應的layer的上下文。在渲染的時候,就是把圖形渲染到對應的layer上。
在執行渲染操做的時候,本質上它的內部至關於執行了 [self.layer drawInContext:ctx];
2) 設置CALayer的delegate,而後讓delegate實現drawLayer:inContext:方法,當CALayer須要繪圖時,會調用delegate的drawLayer:inContext:方法進行繪圖。
補充:
1)不管採起哪一種方法來自定義層,都必須調用CALayer的setNeedsDisplay方法才能正常繪圖。
2)詳細現實過程:
當UIView須要顯示時,它內部的層會準備好一個CGContextRef(圖形上下文),而後調用delegate(這裏就是UIView)的drawLayer:inContext:方法,而且傳入已經準備好的CGContextRef對象。而UIView在drawLayer:inContext:方法中又會調用本身的drawRect:方法。平時在drawRect:中經過UIGraphicsGetCurrentContext()獲取的就是由層傳入的CGContextRef對象,在drawRect:中完成的全部繪圖都會填入層的CGContextRef中,而後被拷貝至屏幕。
實現drawrect方法就能展現到layer上去