在此先貼上我學習的參考博客:http://www.cnblogs.com/kenshincui/p/3972100.html
CALayer基本介紹:
在iOS中CALayer的設計主要是了爲了內容展示和動畫操作,CALayer本身並不包含在UIKit中,它不能響應事件。由於CALayer在設計之初就考慮它的動畫操作功能,CALayer很多屬性在修改時都能形成動畫效果,這種屬性稱爲“隱式動畫屬性”。但是對於UIView的根圖層而言屬性的修改並不形成動畫效果,因爲很多情況下根圖層更多的充當容器的做用,如果它的屬性變動形成動畫效果會直接影響子圖層。另外,UIView的根圖層創建工作完全由iOS負責完成,無法重新創建,但是可以往根圖層中添加子圖層或移除子圖層。
我的理解爲以下幾點:1.CALayer不能響應事件 2.CALayer很多屬性在修改時都能形成動畫效果,這種屬性還有一個名字——“隱式動畫屬性” 3.CALayer的根圖層而言,屬性的修改不能形成動畫 4.UIView的根圖層無法重新創建,但是可以添加(刪除)子圖層
下表列出了CALayer常用的屬性:
屬性 | 說明 | 是否支持隱式動畫 |
---|---|---|
anchorPoint | 和中心點position重合的一個點,稱爲“錨點”,錨點的描述是相對於x、y位置比例而言的默認在圖像中心點(0.5,0.5)的位置 | 是 |
backgroundColor | 圖層背景顏色 | 是 |
borderColor | 邊框顏色 | 是 |
borderWidth | 邊框寬度 | 是 |
bounds | 圖層大小 | 是 |
contents | 圖層顯示內容,例如可以將圖片作爲圖層內容顯示 | 是 |
contentsRect | 圖層顯示內容的大小和位置 | 是 |
cornerRadius | 圓角半徑 | 是 |
doubleSided | 圖層背面是否顯示,默認爲YES | 否 |
frame | 圖層大小和位置,不支持隱式動畫,所以CALayer中很少使用frame,通常使用bounds和position代替 | 否 |
hidden | 是否隱藏 | 是 |
mask | 圖層蒙版 | 是 |
maskToBounds | 子圖層是否剪切圖層邊界,默認爲NO | 是 |
opacity | 透明度 ,類似於UIView的alpha | 是 |
position | 圖層中心點位置,類似於UIView的center | 是 |
shadowColor | 陰影顏色 | 是 |
shadowOffset | 陰影偏移量 | 是 |
shadowOpacity | 陰影透明度,注意默認爲0,如果設置陰影必須設置此屬性 | 是 |
shadowPath | 陰影的形狀 | 是 |
shadowRadius | 陰影模糊半徑 | 是 |
sublayers | 子圖層 | 是 |
sublayerTransform | 子圖層形變 | 是 |
transform | 圖層形變 | 是 |
// // KCMainViewController.m // CALayer // // Created by Kenshin Cui on 14-3-22. // Copyright (c) 2014年 Kenshin Cui. All rights reserved. // #import "KCMainViewController.h" #define WIDTH 50 @interface KCMainViewController () @end @implementation KCMainViewController - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view. [self drawMyLayer]; } #pragma mark 繪製圖層 -(void)drawMyLayer{ CGSize size=[UIScreen mainScreen].bounds.size; //獲得根圖層 CALayer *layer=[[CALayer alloc]init]; //設置背景顏色,由於QuartzCore是跨平臺框架,無法直接使用UIColor layer.backgroundColor=[UIColor colorWithRed:0 green:146/255.0 blue:1.0 alpha:1.0].CGColor; //設置中心點 layer.position=CGPointMake(size.width/2, size.height/2); //設置大小 layer.bounds=CGRectMake(0, 0, WIDTH,WIDTH); //設置圓角,當圓角半徑等於矩形的一半時看起來就是一個圓形 layer.cornerRadius=WIDTH/2; //設置陰影 layer.shadowColor=[UIColor grayColor].CGColor; layer.shadowOffset=CGSizeMake(2, 2); layer.shadowOpacity=.9; //設置邊框 // layer.borderColor=[UIColor whiteColor].CGColor; // layer.borderWidth=1; //設置錨點 // layer.anchorPoint=CGPointZero; [self.view.layer addSublayer:layer]; } #pragma mark 點擊放大 -(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event{ UITouch *touch=[touches anyObject]; CALayer *layer=self.view.layer.sublayers[0]; CGFloat width=layer.bounds.size.width; if (width==WIDTH) { width=WIDTH*4; }else{ width=WIDTH; } layer.bounds=CGRectMake(0, 0, width, width); layer.position=[touch locationInView:self.view]; layer.cornerRadius=width/2; } @end
於是,我在if(width== WIDTH)和else兩個地方設置了斷點,並且打印了width的值,打印了self.view.layer.sublayers:也就是所有兒子,我發現一個奇怪的問題,width爲0,這很奇怪,而且self.view.sublayers有三個對象,這就讓我想要測試一下,我把self.view.layer.sublayers[0]中的0變成1,2試了一試,發現http://blog.csdn.net/wscqqlucy/article/details/84432362有反應。這個是我的一個疑問,self.view.layer 我就add了一個layer啊,所以他自己應該也有layer,哪是那些layer呢?
於是看了另一個博客:http://blog.csdn.net/wscqqlucy/article/details/8443236 ,看了好久看到這麼一句話:
當你用 addSublayer 來添加一個子圖層時,他會被添加到圖層層次結構的頂層,所以他會顯示在現有所有子圖層的最前面。用一組名爲 insertSublayer 的替代方法,你可以將新視圖插入現有的圖層之間。
這個說明沒有加layer的時候,他自己就有兩個layer,所以add 自己創建的這個layer的時候,這個layer變成了最外面的這個。至於這兩個到底是哪兩個,我敢肯定的是其中一個肯定是self.view.layer。
這段代碼是動態改變了layer屬性中的bounds和position,是“隱身動畫屬性”。