UI進階之CALayer

 

備註: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;

 
2,設置圓角:cornerRadius
3,設置陰影:

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"];

layer的transform是CATransform3D類型的
能夠利用kvc設置layer的transform屬性設值
 
 
 
6,position,anchor point
positon決定了layer的現實位置,anchorpoint是錨點取值範圍(0-1)默認是0.5,指layer上那個點落到position的位置上
 
7.subLayers、superLayer
 
四:CALayer和UIView的選擇

對比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];

    [CATransaction commit]
 
六:自定義layer
1)繼承CALayer
在自定義layer中的-(void)drawInContext:方法不會本身調用,只能本身經過setNeedDisplay方法調用,在view中畫東西DrawRect:方法在view第一次顯示的時候會自動調用。

在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中,而後被拷貝至屏幕。

 

 
 
view內部的layer的代理就是view

實現drawrect方法就能展現到layer上去

相關文章
相關標籤/搜索