CALayer

   //先給出弧度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是不會有圓角效果的

  • 注意,若是設置了maskToBounds=YES,那將不會有陰影效果 
    在此輸入圖片描述

4> 設置邊框寬度和顏色 
1 imageView.layer.borderWidth = 5; 
2 imageView.layer.borderColor = [UIColor redColor].CGColor;

  • 第1行設置邊框寬度爲5

  • 第2行設置邊框顏色爲紅色 
    在此輸入圖片描述

5> 設置旋轉 
imageView.layer.transform = CATransform3DMakeRotation(M_PI_4, 0, 0, 1);

  • 利用transform屬性能夠設置旋轉、縮放等效果

  • M_PI_4表示四分之π,順時針旋轉45°

  • 後面的(0, 0, 1)表示Z軸這個向量,修改這個向量能夠作一些三維旋轉效果,你能夠隨便改個值試一下,好比(1, 1, 1)

  • 整體的意思是layer會繞着Z軸順時針旋轉45°,也就是在x、y平面進行旋轉 
    在此輸入圖片描述

上面已經說過,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];

  • 第1行建立了一個自動釋放的CALayer對象,你也可使用經典的alloc和init方法來建立

  • 第12行將建立好的層添加到控制器的view的層中 
    在此輸入圖片描述

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爲其餘值時,以此類推。

相關文章
相關標籤/搜索