界面中看得到的東西就是CALayer
我們見的最多的就是 UIView, 但是每個 UIView 中可以看得見的東西是 CALayer漆羔。
// 每個 UIView 對象都會有一個 layer 的 root 圖層梧奢。
@property(nonatomic,readonly,retain) CALayer *layer;
創(chuàng)建UIView對象時,UIView內(nèi)部會自動創(chuàng)建一個圖層(即CALayer對象)演痒,通過UIView的layer屬性可以訪問這個層亲轨。
UIView需要顯示到屏幕上時,會調(diào)用drawRect:方法進行繪圖嫡霞,并且會將所有內(nèi)容繪制在自己的圖層上瓶埋,繪圖完畢后,系統(tǒng)會將圖層拷貝到屏幕上诊沪,于是就完成了UIView的顯示
換句話說养筒。
UIView本身不具備顯示的功能,擁有顯示功能的是它內(nèi)部的圖層端姚。
UIView 視覺相關的一切我們都可以調(diào)整 view 的 layer 來達到目的晕粪。
view.layer.borderColor // 邊框顏色
view.layer.borderWidth // 邊框?qū)挾?view.layer.cornerRadius // 圓角
view.layer.masksToBounds // 切除多余(切除找出主圖層(根圖層)部分的內(nèi)容)
view.layer.shadowOffse // 偏移(正右負數(shù)左)
view.layer.shadowColor // 顏色
view.layer.shadowOpacity // 透明度
view.layer.shadowPath // 路徑
view.layer.shadowRadius // 半徑
// 對陰影設置有影響
view.layer.masksToBounds
view.clipsToBounds
view.layer.contents = UIImage().cgImage // 設置圖片
view.layer.contentsScale = // 內(nèi)容比例(和圖片配合使用)
view 和 layer 在形變上的區(qū)別
// 2D 變換
view.transform = CGAffineTransform(scaleX: 10, y: 10)
// 3D 變換
view.layer.transform = CATransform3DMakeScale(10, 10, 10)
layer
let layer = CALayer()
layer.backgroundColor = UIColor.red.cgColor
// 大部分情況下 bounds + position 結(jié)合使用設置位置。
// 基本不用frame
layer.bounds = CGRect(x: 0, y: 0, width: 100, height: 100)
layer.position = CGPoint(x: 100, y: 100)
UIView和CALayer的選擇
如果顯示出來的東西需要跟用戶進行交互的話渐裸,用UIView巫湘;如果不需要跟用戶進行交互,用UIView或者CALayer都可以
當然昏鹃,CALayer的性能會高一些尚氛,因為它少了事件處理的功能,更加輕量級洞渤。
UIView可以通過subviews屬性訪問所有的子視圖阅嘶,類似地,CALayer也可以通過sublayers屬性訪問所有的子層
UIView可以通過superview屬性訪問父視圖载迄,類似地讯柔,CALayer也可以通過superlayer屬性訪問父層
position anchorPoint
- position == view.center
- anchorPoint(錨點、重心點)
position : 決定圖層中心在父圖層中的位置护昧。
anchorPoint : 圖層中心點在圖層中的偏移魂迄。
默認情況下 position 和 anchorPoint 是重合的。
它的x惋耙、y取值范圍都是0~1捣炬,默認值為(0.5, 0.5)
anchorPoint = (0, 0)
anchorPoint = (0.5, 0.5)
anchorPoint = (1, 1)
anchorPoint = (0.5, 0)
添加一個紅色圖層到綠色圖層上,紅色圖層顯示到什么位置绽榛,由position屬性決定
假設紅色圖層的position是(100遥金,100)
到底把紅色圖層的哪個點移動到(100,100)的坐標位置蒜田,錨點。
紅色圖層的錨點是(0选泻,0)
紅色圖層的錨點是(0.5冲粤,0.5)
紅色圖層的錨點是(1美莫,1)
紅色圖層的錨點是(0.5,0)
隱式動畫
每一個UIView內(nèi)部都默認關聯(lián)著一個CALayer梯捕,我們可用稱這個Layer為Root Layer(根層)
所有的非Root Layer厢呵,也就是手動創(chuàng)建的CALayer對象,都存在著隱式動畫
什么是隱式動畫傀顾?
當對非Root Layer的部分屬性進行修改時襟铭,默認會自動產(chǎn)生一些動畫效果
而這些屬性稱為Animatable Properties(可動畫屬性)
列舉幾個常見的Animatable Properties:
bounds:用于設置CALayer的寬度和高度。修改這個屬性會產(chǎn)生縮放動畫
backgroundColor:用于設置CALayer的背景色短曾。修改這個屬性會產(chǎn)生背景色的漸變動畫
position:用于設置CALayer的位置寒砖。修改這個屬性會產(chǎn)生平移動畫
關閉隱式動畫
CATransaction.begin()
// 關閉
CATransaction.setDisableActions(true)
CATransaction.commit()
layer 自定義
view 自定義
- 獲取上下文
- 繪制
- 渲染
創(chuàng)建一個類,讓這個類繼承自UIView嫉拐,然后重寫它的DrawRect:方法哩都,然后在該方法中繪制。 調(diào)用 setNeedsDisplay
layer 自定義
- 獲取上下文
- 繪制
- 渲染
創(chuàng)建一個類婉徘,讓這個類繼承自CALayer漠嵌,然后重寫它的drawInContext: 方法,然后在該方法中繪制盖呼。 調(diào)用 setNeedsDisplay (UIView 在第一次顯示的時候會調(diào)用)
override func draw(in ctx: CGContext) {
//1.繪制圖形
//畫一個圓
ctx.addEllipse(in: CGRect(x: 50, y: 50, width: 50, height: 50))
//設置屬性(顏色)
// [[UIColor yellowColor]set];
ctx.setFillColor(red: 0, green: 0, blue: 1, alpha: 1)
//2.渲染
ctx.fillPath()
}
// 發(fā)現(xiàn)不顯示儒鹿,可能是沒有調(diào)用這個方法
layer.setNeedsDisplay() (layer 需要手動調(diào)用)