CALayer和核心動畫
CALayer和UIView(CA框架)
- CALayer是View內的圖層,現實圖案等內容其實在這里面.(效率更快,不耗CUP)
- UIView只負責監聽和點擊事件
CALayer的基本屬性
首先CA開頭的類,是屬于CG框架,UI屬性都要進行類型轉換.
- position和bounds(圖層建議使用bounds,不使用frame)位置和大小
- contents內容(可顯示圖片,注意類型轉換為.CGImage.
redView.layer.contents = (__bridge id _Nullable)([UIImage imageNamed:@"CALayer2"].CGImage);
- backgroundColor背景色
- border邊框(邊框顏色borderColor,邊框寬度borderWidth)
- shadow陰影,四個屬(shadowColor陰影顏色,shadowOffset陰影偏移量,shadowRadius高斯半徑)一起出現才能顯示,且陰影不透明度(shadowOpacity)要為1(默認為0).
- ** cornerRadius (邊角弧度), maskToBounds 是否裁剪成對存在**
- ** opacity ** 不透明度
- ** transform **仿射變換
只有layer下核心動畫是假象,位置不發生改變.layer的transform位置也是發生改變的.
單獨創建Layer顯示
Layer特點:自帶隱式動畫,跟Layer除外,但可以手動關閉:
- 開始事物
- 設置行為不實現
- 寫你要實現的動畫
- 提交事務
//開啟事物
// [CATransaction begin];
//設置事物為不實現行為
// [CATransaction setDisableActions:YES];
self.layer.position = CGPointMake(100, 400);
//提交事物
// [CATransaction commit];```
1. 創建CALayer對象.
2. 設置Layer對象的屬性(使我們能看見)
3. 添加到父Layer中
``` [self.view.layer addSublayer:layer]; ```
#### transform屬性(仿射變換)
//旋轉(3D),理解3d旋轉 ,在Z軸上旋轉常見,常用)
self.layer.transform = CATransform3DRotate(self.layer.transform, M_PI_2, 0, 0, 1);
//縮放(只能在x,y軸縮放,因為Z軸平移縮放視覺無法發現)
self.layer.transform = CATransform3DScale(self.layer.transform, 0.8, 0.8, 1);
//平移(只能在x,y軸縮放,因為Z軸平移縮放視覺無法發現)
self.layer.transform = CATransform3DTranslate(self.layer.transform, 10, 10, 0);
#### Layer時鐘動畫
知識點1:anchorPoint錨點和position位置,之間的關系
anchorPoint錨點(定點),范圍(0~1)決定Layer以錨點比例存在的位置,0,0在左下,默認在中心,0.5,0.5.
知識點2:CADisplayLink刷幀定時器,每秒刷新頻率60次.
CABasicAnimation *basic = [CABasicAnimation animationWithKeyPath:@"position"];
KeyPath參數transform.rotation 就是旋轉關鍵字
CADisplayLink *link = [CADisplayLink displayLinkWithTarget:self selector:@selector(move)];
[link addToRunLoop:[NSRunLoop mainRunLoop] forMode:NSDefaultRunLoopMode];
知識點3:根據日歷顯示當前時間
1. 獲取時間對象(NSDate)
2. 獲取當前日歷對象( NSCalendar )
3. 根據日歷獲取當前秒數
> NSInteger second = [calender component:NSCalendarUnitSecond fromDate:date];
1. 通過圖層顯示時針
2. 裁剪
3. 制作秒針(修改錨點位置)
4. 設置刷幀定時器(調用方法)
5. 方法內實現秒針,旋轉.
Layer的核心動畫(真實位置不發生改變).
動畫設置代理(隱式代理,不用遵守代理協議,這個協議作為代理的分類了)
> CABasicAnimation 基本動畫,可以實現平移翻轉,縮放的動畫
> CAKeyframeAnimation 關鍵幀動畫,通過幀的形式播放動畫,可以有多個點 values屬性
> CAAnimationGroup 組動畫,內部可以有多個動畫為一組播放.animations 屬性
> CATransition 轉場動畫
動畫的不返回屬性
basic.removedOnCompletion = NO;
basic.fillMode =
1. 轉場動畫需要手勢storyBoard拖入輕掃手勢.(需要幾個拖幾個手勢對象),加入到View的手勢中
2. 判斷手勢方向,顯示圖片內容
3. 創建轉場動畫
> //設置屬性
transition.type = kCATransitionFade;//轉場方式
transition.subtype = kCATransitionFromRight;那個方向顯示轉場方式.
4. 加入到圖層Layer中
#### 小畫板案例
1. 搭建界面
2. 先畫單線
1. touchBegin取出起始點,繪制路徑,保存路徑(屬性接收touchMove中要用)
2. touchMove中添加線條.重繪
3. drawRect系統方法中渲染.
3. 畫多線:思路,多線就需要保存多組路徑,且首尾不想連.所以需要路徑數組
1. 創建路徑可變數組(記住實例化,可懶加載,也可awakeNIb中寫.
2. 將起始點路徑加入到這個數組中(touchBegin),根絕這個路徑添加線
3. 改變單條路徑渲染為遍歷數組渲染.
3. 改變線的顏色,粗細
1. 同過slider的的值傳遞到View中(屬性),更改線粗為屬性值
2. 傳遞點擊按鈕的背景顏色到內部.內部定以UIColor屬性,但是UIBezier內沒有線的顏色屬性(怎么給這個路徑對象這個屬性呢??直接創建一個類繼承UIBezier,我們在內部給他定義這個UIColor屬性,更改路徑為你自定義的這個類,給他UIColor屬性設置為外界傳進來的顏色),給你的每個路徑設置顏色.
4. 實現各個按鈕的點擊事件(記住原則控制器不關心內部實現,自己的事情自己做,他只負責調用方法.
1. 清除按鈕清除集合中的路徑
2. 返回:清除上一個元素
3. 擦除:用畫板的背景色在繪制這個顏色覆蓋原來的顏色
4. 保存圖片
- 開啟圖片上下文 UIGraphicsBeginImageContextWithOptions(self.myPaintView.bounds.size, NO, 0);
- 獲取當前上下文,因為截屏需要獲取上下文(整個就不用了) CGContextRef ctx = UIGraphicsGetCurrentContext();
- 截圖 [self.myPaintView.layer renderInContext:ctx];
- 獲取截圖 UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();
- 關閉上下文 UIGraphicsEndImageContext();
- 保存到相冊 UIImageWriteToSavedPhotosAlbum(newImage, nil, nil, nil);