UIview內部有個預設的CALayer對象層,雖然我門不可以重新創建它,但是我門可以再其上面添加子層。 我們知道,UIView有 addSubview:方法,同樣,CALayer也有addSublayer:方法。我門可以通過addSublayer:再已有layer上添加自層。 下麵我門演示如何添加
UIview內部有個預設的CALayer對象層,雖然我門不可以重新創建它,但是我門可以再其上面添加子層。
我們知道,UIView有 addSubview:方法,同樣,CALayer也有addSublayer:方法。我門可以通過addSublayer:再已有layer上添加自層。
下麵我門演示如何添加自層。
// // ViewController.m // CX - CALayer(二) // // Created by ma c on 16/3/19. // Copyright © 2016年 xubaoaichiyu. All rights reserved. // #import "ViewController.h" @interface ViewController () @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; //初始化layer CALayer * layer = [[CALayer alloc]init]; //設置layer的frame layer.frame = CGRectMake(0, 20, self.view.frame.size.width, 200); //設置layer的背景顏色 layer.backgroundColor = [UIColor orangeColor].CGColor; //再self.view.layer上添加layer [self.view.layer addSublayer:layer]; } @end
除了這種簡單的圖層,我門還可以設置圖片的圖層。(layer.contents = (id)[UIImage imageNamed:@"nvshen.jpg"].CGImage;)
// // ViewController.m // CX - CALayer(二) // // Created by ma c on 16/3/19. // Copyright © 2016年 xubaoaichiyu. All rights reserved. // #import "ViewController.h" @interface ViewController () @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; //初始化layer CALayer * layer = [[CALayer alloc]init]; //設置layer的frame layer.frame = CGRectMake(0, 20, self.view.frame.size.width, self.view.frame.size.height); //添加圖片 layer.contents = (id)[UIImage imageNamed:@"nvshen.jpg"].CGImage; //設置layer的背景顏色 layer.backgroundColor = [UIColor orangeColor].CGColor; //再self.view.layer上添加layer [self.view.layer addSublayer:layer]; } @end
下麵引用MJ神的講解:
為什麼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
UIView和CALayer的選擇
* 其實,對比CALayer,UIView多了一個事件處理的功能。也就是說,CALayer不能處理用戶的觸摸事件,而UIView可以
* 所以,如果顯示出來的東西需要跟用戶進行交互的話,用UIView;如果不需要跟用戶進行交互,用UIView或者CALayer都可以
* 當然,CALayer的性能會高一些,因為它少了事件處理的功能,更加輕量級
UIView和CALayer的其他關係
* UIView可以通過subviews屬性訪問所有的子視圖,類似地,CALayer也可以通過sublayers屬性訪問所有的子層
* UIView可以通過superview屬性訪問父視圖,類似地,CALayer也可以通過superlayer屬性訪問父層
* 下麵再看一張UIView和CALayer的關係圖:
如果兩個UIView是父子關係,那麼它們內部的CALayer也是父子關係。