//先給出弧度web
lblMsg.layer.cornerRadius = 6;框架
//在截取角性能
lblMsg.layer.masksToBounds = YES;動畫
1、什麼是CALayerspa
在iOS系統中,你能看得見摸得着的東西基本上都是UIView,好比一個按鈕、一個文本標籤、一個文本輸入框、一個圖標等等,這些都是UIView。.net
其實UIView之因此能顯示在屏幕上,徹底是由於它內部的一個層。code
在建立UIView對象時,UIView內部會自動建立一個層(即CALayer對象),經過UIView的layer屬性能夠訪問這個層。當UIView須要顯示到屏幕上時,會調用drawRect:方法進行繪圖,而且會將全部內容繪製在本身的層上,繪圖完畢後,系統會將層拷貝到屏幕上,因而就完成了UIView的顯示。orm
換句話說,UIView自己不具有顯示的功能,是它內部的層纔有顯示功能。對象
2、CALayer的簡單使用事件
上面已經說過了,UIView之因此可以顯示,徹底是由於內部的CALayer對象。所以,經過操做這個CALayer對象,能夠很方便地調整UIView的一些界面屬性,好比:陰影、圓角大小、邊框寬度和顏色等。
1.CALayer是被定義在QuartzCore框架中的,所以要想使用CALayer,先導入QuartzCore框架
在項目描述頁面添加框架便可!
2.在項目代碼中導入QuartzCore框架的主頭文件
// #import
3.經過CALayer修改UIImageView的界面屬性
你也可使用UIButton或者UILabel,這裏就以UIImageView爲例子
<!-- lang: cpp -->1> 先建立一個UIImageView,添加到控制器的view中
1 UIImage image = [UIImage imageNamed:@「lufy.png」];
2 UIImageView imageView = [[[UIImageView alloc] initWithImage:image] autorelease];
3 imageView.center = CGPointMake(100, 100);
4 [self.view addSubview:imageView];
2> 設置陰影
1 imageView.layer.shadowColor = [UIColor grayColor].CGColor;
2 imageView.layer.shadowOffset = CGSizeMake(10, 10);
3 imageView.layer.shadowOpacity = 0.5;
第1行設置陰影的顏色爲灰色,注意,這裏使用的是UIColor的CGColor屬性,是一種CGColorRef類型的數據
第2行設置陰影的偏移大小,能夠看出陰影往原圖的右下角偏移
第3行設置陰影的不透明度爲0.5,表示半透明。若是爲1,表明徹底不透明。
3> 設置圓角大小
經過layer屬性能夠訪問視圖內部的CALayer對象
1 imageView.layer.cornerRadius = 10;
2 imageView.layer.masksToBounds = YES;
第1行設置圓角半徑爲10
第2行的maskToBounds=YES:能夠看作是強制內部的全部子層支持圓角效果,少了這個設置,UIImageView是不會有圓角效果的
4> 設置邊框寬度和顏色
1 imageView.layer.borderWidth = 5;
2 imageView.layer.borderColor = [UIColor redColor].CGColor;
5> 設置旋轉
imageView.layer.transform = CATransform3DMakeRotation(M_PI_4, 0, 0, 1);
利用transform屬性能夠設置旋轉、縮放等效果
M_PI_4表示四分之π,順時針旋轉45°
後面的(0, 0, 1)表示Z軸這個向量,修改這個向量能夠作一些三維旋轉效果,你能夠隨便改個值試一下,好比(1, 1, 1)
上面已經說過,UIView內部默認有個CALayer對象(層),經過layer屬性能夠訪問這個層。要注意的是,這個默認的層不容許從新建立,但能夠往層裏面添加子層
UIView能夠經過addSubview:方法添加子視圖,相似地,CALayer能夠經過addSublayer:方法添加子層
接下來演示一下如何添加子層:
3、添加一個簡單的圖層
<!-- lang: cpp -->CALayer *myLayer = [CALayer layer];
// 設置層的寬度和高度(100x100)
myLayer.bounds = CGRectMake(0, 0, 100, 100);
// 設置層的位置
myLayer.position = CGPointMake(100, 100);
// 設置層的背景顏色:紅色
myLayer.backgroundColor = [UIColor redColor].CGColor;
// 設置層的圓角半徑爲10
myLayer.cornerRadius = 10;
// 添加myLayer到控制器的view的layer中
[self.view.layer addSublayer:myLayer];
4、添加一個顯示圖片的圖層
<!-- lang: cpp -->CALayer *myLayer = [CALayer layer];
// 設置層的寬度和高度(100x100)
myLayer.bounds = CGRectMake(0, 0, 100, 100);
// 設置層的位置
myLayer.position = CGPointMake(100, 100);
// 設置須要顯示的圖片
myLayer.contents = (id)[UIImage imageNamed:@「lufy.png」].CGImage;
// 設置層的圓角半徑爲10
myLayer.cornerRadius = 10;
// 若是設置了圖片,須要設置這個屬性爲YES纔有圓角效果
myLayer.masksToBounds = YES;
// 添加myLayer到控制器的view的layer中
[self.view.layer addSublayer:myLayer];
在第7行設置須要顯示的圖片,注意,這裏用的是UIImage的CGImage屬性,是一種CGImageRef類型的數據
5、爲何CALayer中使用CGColorRef和CGImageRef這2種數據類型,而不用UIColor和UIImage?
首先要知道: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方法能夠返回一個CGImageRef
6、UIView和CALayer的選擇
細心的朋友不難發現,其實前面的2個效果不只能夠經過添加層來實現,還能夠經過添加UIView來實現。好比,第1個紅色的層能夠用一個UIView來實現,第2個顯示圖片的層能夠用一個UIImageView來實現。 既然CALayer和UIView都能實現相同的顯示效果,那究竟該選擇誰好呢?
其實,對比CALayer,UIView多了一個事件處理的功能。也就是說,CALayer不能處理用戶的觸摸事件,而UIView能夠
因此,若是顯示出來的東西須要跟用戶進行交互的話,用UIView;若是不須要跟用戶進行交互,用UIView或者CALayer均可以
固然,CALayer的性能會高一些,由於它少了事件處理的功能,更加輕量級
7、UIView和CALayer的其餘關係
UIView能夠經過subviews屬性訪問全部的子視圖,相似地,CALayer也能夠經過sublayers屬性訪問全部的子層
UIView能夠經過superview屬性訪問父視圖,相似地,CALayer也能夠經過superlayer屬性訪問父層
若是兩個UIView是父子關係,那麼它們內部的CALayer也是父子關係。
8、隱式動畫屬性
每個UIView內部都默認關聯着一個CALayer,咱們可用稱這個Layer爲Root Layer(根層)。全部的非Root Layer,也就是手動建立的CALayer對象,都存在着隱式動畫。
當對非Root Layer的部分屬性進行相應的修改時,默認會自動產生一些動畫效果,這些屬性稱爲Animatable Properties(可動畫屬性)。
列舉幾個常見的Animatable Properties:
bounds:用於設置CALayer的寬度和高度。修改這個屬性會產生縮放動畫
backgroundColor:用於設置CALayer的背景色。修改這個屬性會產生背景色的漸變更畫
position:用於設置CALayer的位置。修改這個屬性會產平生移動畫
好比:假設一開始CALayer的position爲(100, 100),而後在某個時刻修改成(200, 200),那麼整個CALayer就會在短期內從(100, 100)這個位置平移到(200, 200)
咱們也能夠從官方文檔中查詢全部的Animatable Properties
9、position和anchorPoint
position和anchorPoint屬性都是CGPoint類型的
position能夠用來設置CALayer在父層中的位置,它是以父層的左上角爲座標原點(0, 0)
anchorPoint稱爲"定位點」,它決定着CALayer身上的哪一個點會在position屬性所指的位置。它的x、y取值範圍都是0~1,默認值爲(0.5, 0.5)
1.建立一個CALayer,添加到控制器的view的layer中
CALayer *myLayer = [CALayer layer];
// 設置層的寬度和高度(100x100)
myLayer.bounds = CGRectMake(0, 0, 100, 100);
// 設置層的位置
myLayer.position = CGPointMake(100, 100);
// 設置層的背景顏色:紅色
myLayer.backgroundColor = [UIColor redColor].CGColor;
// 添加myLayer到控制器的view的layer中
[self.view.layer addSublayer:myLayer];
第5行設置了myLayer的position爲(100, 100),又由於anchorPoint默認是(0.5, 0.5),因此最後的效果是:myLayer的中點會在父層的(100, 100)位置
2.若將anchorPoint改成(0, 0),myLayer的左上角會在(100, 100)位置
1 myLayer.anchorPoint = CGPointMake(0, 0);
3.若將anchorPoint改成(1, 1),myLayer的右下角會在(100, 100)位置
1 myLayer.anchorPoint = CGPointMake(1, 1);
4.將anchorPoint改成(0, 1),myLayer的左下角會在(100, 100)位置
1 myLayer.anchorPoint = CGPointMake(0, 1);
我想,你應該已經明白anchorPoint的用途了吧,它決定着CALayer身上的哪一個點會在position所指定的位置上。它的x、y取值範圍都是0~1,默認值爲(0.5, 0.5),所以,默認狀況下,CALayer的中點會在position所指定的位置上。當anchorPoint爲其餘值時,以此類推。