本文目錄 一、添加一個簡單的圖層 二、添加一個顯示圖片的圖層 三、為什麼CALayer中使用CGColorRef和CGImageRef這2種資料類型,而不用UIColor和UIImage。 四、UIView和CALayer的選擇 五、UIView和CALayer的其他關係 * 上一講已經說過,UIView內部預設有個CALayer對象(層),通過layer屬性可以訪問這個層。要注意的是,這個預設的層不允許重新建立,但可以往層裡面添加子層 * UIView可以通過addSubview:方法添加子視圖,類似地,CALayer可以通過addSublayer:方法添加子層 接下來示範一下如何添加子層: 回到頂部
一、添加一個簡單的圖層
1 CALayer *myLayer = [CALayer layer]; 2 // 設定層的寬度和高度(100x100) 3 myLayer.bounds = CGRectMake(0, 0, 100, 100); 4 // 設定層的位置 5 myLayer.position = CGPointMake(100, 100); 6 // 設定層的背景顏色:紅色 7 myLayer.backgroundColor = [UIColor redColor].CGColor; 8 // 設定層的圓角半徑為10 9 myLayer.cornerRadius = 10;10 11 // 添加myLayer到控制器的view的layer中12 [self.view.layer addSublayer:myLayer];
* 第1行建立了一個自動釋放的CALayer對象,你也可以使用經典的alloc和init方法來建立
* 第12行將建立好的層添加到控制器的view的層中
回到頂部 二、添加一個顯示圖片的圖層
1 CALayer *myLayer = [CALayer layer]; 2 // 設定層的寬度和高度(100x100) 3 myLayer.bounds = CGRectMake(0, 0, 100, 100); 4 // 設定層的位置 5 myLayer.position = CGPointMake(100, 100); 6 // 設定需要顯示的圖片 7 myLayer.contents = (id)[UIImage imageNamed:@"lufy.png"].CGImage; 8 // 設定層的圓角半徑為10 9 myLayer.cornerRadius = 10;10 // 如果設定了圖片,需要設定這個屬性為YES才有圓角效果11 myLayer.masksToBounds = YES;12 13 // 添加myLayer到控制器的view的layer中14 [self.view.layer addSublayer:myLayer];
* 在第7行設定需要顯示的圖片,注意,這裡用的是UIImage的CGImage屬性,是一種CGImageRef類型的資料
回到頂部 三、為什麼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的選擇
細心的朋友不難發現,其實前面的2個效果不僅可以通過添加層來實現,還可以通過添加UIView來實現。比如,第1個紅色的層可以用一個UIView來實現,第2個顯示圖片的層可以用一個UIImageView來實現。 既然CALayer和UIView都能實現相同的顯示效果,那究竟該選擇誰好呢。
* 其實,對比CALayer,UIView多了一個事件處理的功能。也就是說,CALayer不能處理使用者的觸摸事件,而UIView可以
* 所以,如果顯示出來的東西需要跟使用者進行互動的話,用UIView;如果不需要跟使用者進行互動,用UIView或者CALayer都可以
* 當然,CALayer的效能會高一些,因為它少了事件處理的功能,更加輕量級
回到頂部 五、UIView和CALayer的其他關係
* UIView可以通過subviews屬性訪問所有的子視圖,類似地,CALayer也可以通過sublayers屬性訪問所有的子層
* UIView可以通過superview屬性訪問父視圖,類似地,CALayer也可以通過superlayer屬性訪問父層
* 下面再看一張UIView和CALayer的關係圖:
如果兩個UIView是父子關係,那麼它們內部的CALayer也是父子關係。