###一、CALayer(圖層類)的基本歸納函數
CALayer 是整個圖層類的基礎,它是全部核心動畫圖層類的父類。oop
和視圖類(UIView)同樣,CALayer 有本身的父圖層類,同時也擁有本身子圖層類的集合,它們構成了一個圖層樹的層次結構。動畫
CALayer 從 Application Kit 和 Cocoa Touch 的視圖類分離出來。線程
CALayer 類的內容顯示能夠經過如下方法提供:代理
1. 能夠直接或者委託的方式把圖層的內容屬性設置爲 Core Graphics image。 2. 提供直接繪製到一個 Core Graphics image 上下文委託。 3. 設置全部圖層所具備的可視化樣式屬性,好比背景顏色、不透明屬性、蒙版、邊框、圓角等。 4. CAScrollLayer 是 CALayer 的子類,簡化顯示圖層的一部份內容。CAScrollLayer 對象的滾動區域的範圍在它的子圖層裏面定義。CAScrollLaye 不提供鍵盤或鼠標事件處理,也不提供可見的滾動條。 5. CATextLayer 能夠方便的從字符串或字符串的內容建立一個圖層類的內容。 6. CATiledLayer 容許遞增的顯示大而複雜的圖片。 7. CAEAGLLayer 提供了一個OpenGLES渲染環境。
CALayer 的還擴展了 NSKeyValueCoding 的非正式協議,加入默認鍵值和額外的結構類型的自動對象包裝 (CGPoint,CGSize,CGRect,CGAffineTransform 和 CATransform3D)的支持,並 提供許多這些結構的關鍵路徑領域的訪問。code
CALayer 同時管理與層關聯的動畫和行爲。圖層接受層樹的插入和刪除層動做, 修改層的屬性,或者明確的開發請求。這些行爲一般會致使動畫發生(隱式動畫)
。orm
雖然核心動畫的圖層和 Cocoa 的視圖在很大程度上沒有必定的類似性,可是他們二者**最大的區別是,圖層不會直接渲染到屏幕上。
**對象
在模型-視圖-控制器(model-view-controller)概念裏面 NSView 和 UIView 是典 型的視圖部分,可是在覈心動畫裏面圖層是模型部分。圖層封裝了幾何、時間、可視 化屬性,同時它提供了圖層現實的內容,可是實際顯示的過程則不是由它來完成。繼承
每一個可見的圖層樹由兩個相應的樹組成:一個是呈現樹,一個是渲染樹。進程
###二、圖層樹
圖層樹是核心動畫裏面相似 Cocoa 視圖的層次結構,一個核心動畫的圖層擁有父圖層(suplayer)和子圖層(sublayer)。
核心動畫不提供在一個窗口(window)實際顯示圖層的手段,它們必須經過視圖來託管。當視圖和圖層一塊兒的時候,視圖爲圖層提供了底層的事件處理,而圖層爲視圖提供了顯示的內容
。
iOS 上面的視圖系統直接創建在覈心動畫的圖層上面。每一個 UIView 的實例會自動的建立一個 CALayer 類的實例,而後把該實例賦值給視圖的 layer 屬性。
/*一、每個UIView都會有一個layer。 二、將layer添加到父layer中,self.view.layer爲父圖層,layer爲子圖層。 */ CALayer *layer = [CALayer layer]; layer.frame = CGRectMake(100, 100, 200, 200); layer.backgroundColor = [UIColor blueColor].CGColor; [self.view.layer addSublayer:layer];
###三、給CALayer提供內容 你能夠經過如下任何一種方法指定 CALayer 實例的內容:
CGImageRef
來顯式的設置圖層的 contents 的屬性。// 給layer添加圖片內容 CALayer *imageLayer = [CALayer layer]; imageLayer.frame = CGRectMake(50, 100, 200, 200); imageLayer.backgroundColor = [UIColor lightGrayColor].CGColor; UIImage *image = [UIImage imageNamed:@"心.png"]; imageLayer.contents = (__bridge id)(image.CGImage); [self.view.layer addSublayer:imageLayer];
// 填充文字的layer:CATextLayer CATextLayer *textLayer = [CATextLayer layer]; textLayer.frame = CGRectMake(50, 400, 200, 30); textLayer.foregroundColor = [UIColor redColor].CGColor; textLayer.backgroundColor = [UIColor lightGrayColor].CGColor; textLayer.string = @"這是填充文字的leyer"; textLayer.fontSize = 20; textLayer.font = (__bridge CFTypeRef )(@"楷體"); textLayer.alignmentMode = kCAAlignmentCenter; [self.view.layer addSublayer:textLayer];
displayLayer:
或 drawLayer:inContext:
。經過發送如下任何一個方法 setNeedsDisplay
或 者 setNeedsDisplayInRect:
的消息, 或者把圖層的 needsDisplayOnBoundsChange
屬性值設置爲 YES。- (void)viewDidLoad { [super viewDidLoad]; CALayer *drawLayer = [CALayer layer]; drawLayer.frame = CGRectMake(50, 400, 200, 200); [self.view.layer addSublayer:drawLayer]; drawLayer.delegate = self; [drawLayer setNeedsDisplay]; // 重繪 } // CALayer的代理方法<CALayerDelegate> - (void)drawLayer:(CALayer *)layer inContext:(CGContextRef)ctx { // 畫矩形 CGRect rect = CGRectMake(50, 0, 100, 50); CGContextSetRGBFillColor(ctx, 0.1, 0.5, 0.5, 1); CGContextSetRGBStrokeColor(ctx, 1.0, 0.1, 0.1, 1); CGContextAddRect(ctx, rect); CGContextDrawPath(ctx, kCGPathFillStroke); }
###四、修改圖層內容的位置 CALayer 的屬性 contentsGravity
容許你在圖層的邊界內容修改圖層的 contents 圖片的位置或者伸縮值。默認狀況下,內容的圖像徹底填充層的邊界,忽視天然的圖像寬高比。
相應填充的位置:
1. kCAGravityTopLeft // 左上 2. kCAGravityTop // 頂部 3. kCAGravityTopRight // 右上 4. kCAGravityLeft // 左 5. kCAGravityCenter // 中心 6. kCAGravityRight // 右 7. kCAGravityBottomLeft // 左下 8. kCAGravityBottom // 下 9. kCAGravityBottomRight // 右下 10.kCAGravityResize // 拉伸 11.kCAGravityResizeAspect // 等比例 12.kCAGravityResizeAspectFill // 徹底填充
###五、圖層樣式屬性
frame
--座標尺寸bounds
--尺寸position
--定位點,子圖層的錨點在父圖層中的哪一個座標點。anchorPoint
--錨點(0 ~ 1),決定子圖層哪一個點在position點上、旋轉的支點。默認(0.5,0.5)cornerRadius
--圓角弧度transform
--座標變換,控制縮放、旋轉、移動。zPosition
--在父圖層中的層次。backgroundColor
--背景顏色contents
sublayers
--設置子多個圖層masksToBounds
--是否剪切超出父圖層邊界的部分,默認爲NOsublayerTransform
--子圖層的座標系統borderColor
-- 邊框的顏色borderWidth
-- 邊框的寬度shadowColor
--陰影顏色shadowOffset
--陰影尺寸,maskToBounds不能設爲YES。shadowOpacity
--陰影透明度shadowRadius
--陰影圓角弧度opacity
mask
CALayer *pLayer = [CALayer layer]; [self.view.layer addSublayer:pLayer]; //座標尺寸、背景顏色 pLayer.frame = CGRectMake(50, 100, 200, 200); pLayer.backgroundColor = [UIColor lightGrayColor].CGColor; //內容 pLayer.contents = (__bridge id)[UIImage imageNamed:@"image.jpg"].CGImage; pLayer.contentsGravity = kCAGravityResize; // 圓角 pLayer.cornerRadius = 20; pLayer.masksToBounds = YES; // 必須設爲YES圓角才起做用 // 邊框 pLayer.borderColor = [UIColor blackColor].CGColor; pLayer.borderWidth = 5; // 陰影 pLayer.shadowColor = [UIColor grayColor].CGColor; pLayer.shadowOffset = CGSizeMake(5, 5); pLayer.shadowOpacity = 1; pLayer.shadowRadius = 10; //透明度 pLayer.opacity = 0.5; //座標變換transform,縮放、旋轉、移動 pLayer.transform = CATransform3DMakeScale(0.5, 0.5, 1); pLayer.transform = CATransform3DMakeRotation(M_PI_4, 0, 0, 1); pLayer.transform = CATransform3DMakeTranslation(0, 50, 0); //KVC設置transform [pLayer setValue:@0.5 forKeyPath:@"transform.scale"]; [pLayer setValue:@1.0 forKeyPath:@"transform.scale.x"]; [pLayer setValue:@M_PI_4 forKeyPath:@"transform.rotation"]; [pLayer setValue:@50 forKeyPath:@"transform.translation.y"];
###六、圖層的行爲(隱式動畫)
圖層的行爲在如下狀況發生的時候被觸發:從圖層樹裏面插入或者刪除一個圖層,圖層的屬性值被修改了,或者程序顯式要求。一般狀況下,行爲觸發器是動畫顯示的結果所在。
一個行爲對象是一個經過 CAAction
協議響應行爲標識符的對象。行爲標識符使 用標準圓點分隔的關鍵路徑來命名。圖層負責把行爲標識符映射到特定的行爲對象。 當一個特定標識符的行爲對象被肯定的時候,它會發送一個 CAAction 協議定義的消息。
CALayer類提供了默認的CAAnimation的行爲對象實例,一個兼容類全部動畫層屬性CAAction協議。
CALayer類提供了默認的CAAnimation的行爲對象實例,一個兼容類全部動畫層屬性CAAction協議。
// 當改變layer屬性值得時候,會自動產生一個動畫,這個動畫叫隱式動畫 pLayer.opacity=0.0; pLayer.position=CGPointMake(0.0,0.0); pLayer.transform = CATransform3DMakeScale(0.5, 0.5, 1);
###七、事務 圖層的每一個改變都是事務的一部分。CATransaction
是核心動畫類,它負責成批的把多個圖層樹的修改做爲一個原子更新到渲染樹。
隱式事務:
runloop
)的線程修改圖層的屬性的時候,你必須使用顯式的事務。顯示事務:
begin
消息來建立一 個顯式事務,修改完成以後發送 comit
消息。kCATransactionDisableActions
或者setDisableActions
值爲 YES 來暫時禁用圖層的行爲。在事務範圍所做的任何更改也不會所以而發生的動畫。[CATransaction begin]; [CATransaction setValue:(id)kCFBooleanTrue forKey:kCATransactionDisableActions]; //[CATransaction setDisableActions:YES]; [aLayer removeFromSuperlayer];
 [CATransaction commit]; ```
3. 能夠暫時改變響應改變圖層屬性的動畫的時間,經過設置事務的 `kCATransactionAnimationDuration`或者`setAnimationDuration` 鍵的值爲新的時間。 ``` [CATransaction begin]; [CATransaction setValue:[NSNumber numberWithFloat:10.0f] forKey:kCATransactionAnimationDuration]; //[CATransaction setAnimationDuration:10.0f]; theLayer.zPosition=200.0; theLayer.opacity=0.0; [CATransaction commit]; ```
事務嵌套:
顯式事務能夠被嵌套,容許你禁用部分動畫的行爲或者在屬性被修改的時候產生 的動畫使用不一樣的時間。僅當最外層的事務被提交的時候,動畫纔會發生。
[CATransaction begin]; [CATransaction setAnimationDuration:2]; pLayer.opacity = 0.0; [CATransaction begin]; pLayer.transform = CATransform3DMakeScale(3, 3, 1); [CATransaction commit]; [CATransaction commit];