- 在iOS中躏率,你能看的見摸得著的東西基本上都是
UIView
,比如一個按鈕民鼓、一個文本標簽薇芝、一個文字輸入框,一個圖標等等丰嘉,這些都是UIView - 其實UIView之所以能顯示在屏幕夯到, 完全是應(yīng)為它內(nèi)部的一個
圖層
- 在創(chuàng)建UIView對象時,UIView內(nèi)部會自動創(chuàng)建一個圖層(即
CALayer
對象),通過UIView
的layer屬性可以訪問這個層
@property(nonatomic,readonly,retain)CALayer*layer;
- 當
UIView
需要顯示到屏幕上時饮亏,會調(diào)用drawRect:方法進行繪圖耍贾,并且會將所有的內(nèi)容繪制在自己的圖層上,繪圖完畢后路幸,徐彤會講圖層拷貝到屏幕上荐开,于是就完成了UIView的顯示 - 換句話說,
UIView
本身不具備顯示的功能简肴,是它內(nèi)部的層才有顯示功能
<h5>CALayer的基本使用</h5>
- 通過操作CALayer對象晃听,可以很方便地調(diào)整UIView的一些外觀屬性,比如:
- 陰影
- 圓角大小
- 邊框?qū)挾群皖伾?/li>
- … …
- 還可以給圖層添加動畫砰识,來實現(xiàn)一些比較炫酷的效果
<b>UIView的Layer</b>
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
// 設(shè)置陰影的顏色
self.colorV.layer.shadowColor = [UIColor blackColor].CGColor;
// 設(shè)置陰影的不透明度
self.colorV.layer.shadowOpacity = 1;
// 設(shè)置陰影的偏移量
self.colorV.layer.shadowOffset = CGSizeMake(30, 30);
// 設(shè)置陰影的模糊半徑
self.colorV.layer.shadowRadius = 10;
// 邊框?qū)挾饶馨牵锩孀叩? self.colorV.layer.borderWidth = 10;
// 邊框顏色,
self.colorV.layer.borderColor = [UIColor brownColor].CGColor;
// 設(shè)置圓角
self.colorV.layer.cornerRadius = 30;
}
最終呈現(xiàn)效果
<b>UIView的Layer</b>
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
// 設(shè)置陰影的顏色
self.imageV.layer.shadowColor = [UIColor blackColor].CGColor;
// 設(shè)置陰影的不透明度
self.imageV.layer.shadowOpacity = 1;
// 設(shè)置陰影的偏移量
self.imageV.layer.shadowOffset = CGSizeMake(30, 30);
// 設(shè)置陰影的模糊半徑
self.imageV.layer.shadowRadius = 10;
// 邊框?qū)挾缺枥牵锩孀叩? self.imageV.layer.borderWidth = 10;
// 邊框顏色初斑,
self.imageV.layer.borderColor = [UIColor brownColor].CGColor;
// 注意:UIImageView的layer使用有些不一樣,在設(shè)置圓角的時候需要注意:
// 設(shè)置圓角
self.imageV.layer.cornerRadius = 100;
}
呈現(xiàn)效果:
<b>原因:CALayer層中予借,有一個專門存放圖片的層:contents</b>
self.imageV.layer.masksToBounds = YES;
呈現(xiàn)效果:
<h5>CATransform3D</h5>
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
// 3D效果
[UIView animateWithDuration:0.5 animations:^{
// 第一種設(shè)置方法:
self.imageV.layer.transform = CATransform3DMakeRotation(M_PI, 1, 1, 0);
// 把結(jié)構(gòu)體換成對象
NSValue *value = [NSValue valueWithCATransform3D:CATransform3DMakeRotation(M_PI, 1, 1, 0)];
// 第二種設(shè)置方式:
// 我們一般通過KVC做快速旋轉(zhuǎn)越平。平移频蛔,縮放
[self.imageV.layer setValue:@(M_PI) forKey:@"transform.rotation.x"];
}];
}
<b>在第二種方法中灵迫,forKey的值不是隨便填寫的,它在CATransform3D Key Paths中有規(guī)定</b>
Field Key Path | Description |
---|---|
rotation.x | Set to an NSNumber object whose value is the rotation, in radians, in the x axis. |
rotation.y | Set to an NSNumber object whose value is the rotation, in radians, in the y axis. |
rotation.z | Set to an NSNumber object whose value is the rotation, in radians, in the z axis. |
rotation | Set to an NSNumber object whose value is the rotation, in radians, in the z axis. This field is identical to setting the rotation.z field. |
scale.x | Set to an NSNumber object whose value is the scale factor for the x axis. |
scale.y | Set to an NSNumber object whose value is the scale factor for the y axis. |
scale.z | Set to an NSNumber object whose value is the scale factor for the z axis. |
scale | Set to an NSNumber object whose value is the average of all three scale factors. |
translation.x | Set to an NSNumber object whose value is the translation factor along the x axis. |
translation.y | Set to an NSNumber object whose value is the translation factor along the y axis. |
translation.z | Set to an NSNumber object whose value is the translation factor along the z axis. |
translation | Set to an NSValue object containing an NSSize or CGSize data type. That data type indicates the amount to translate in the x and y axis. |
<h5>UIView和CALayer的選擇</h5>
使用Layer展示一張圖片
CALayer *layer = [[CALayer alloc] init];
layer.backgroundColor = [UIColor brownColor].CGColor;
layer.frame = CGRectMake(100, 100, 100, 100);
[self.view.layer addSublayer:layer];
layer.contents = (id)[UIImage imageNamed:@"123.png"].CGImage;
<b>關(guān)于CALayer的疑惑</b>
- 首先
- CALayer是定義在QuartzCore框架中的
- CGImageRef晦溪、CGColorRef兩種數(shù)據(jù)類型是定義在CoreGraphics框架中的
- UIColor瀑粥、UIImage是定義在UIKit框架中的
- 其次
- QuartzCore框架和CoreGraphics框架是可以跨平臺使用的,在iOS和Mac OS X上都能使用
- 但是UIKit只能在iOS中使用
- 為了保證可移植性三圆,QuartzCore不能使用UIImage狞换、UIColor避咆,只能使用CGImageRef、CGColorRef
<b>UIView和CALayer的選擇</b>
- 通過CALayer修噪,就能做出跟UIImageView一樣的界面效果
- 既然CALayer和UIView都能實現(xiàn)相同的顯示效果查库,那究竟該選擇誰好呢?
- 其實黄琼,對比CALayer樊销,UIView多了一個事件處理的功能。也就是說脏款,CALayer不能處理用戶的觸摸事件围苫,而UIView可以
- 所以,如果顯示出來的東西需要跟用戶進行交互的話撤师,用UIView剂府;如果不需要跟用戶進行交互,用UIView或者CALayer都可以
- 當然剃盾,CALayer的性能會高一些腺占,因為它少了事件處理的功能,更加輕量級
<h5>position和anchorPoint</h5>
<b>CALayer有2個非常重要的屬性:position
和anchorPoint
</b>
- @property CGPoint position;
- 用來設(shè)置CALayer在父層中的位置
- 以父層的左上角為原點(0, 0)
- @property CGPoint anchorPoint;
- 稱為“定位點”万俗、“錨點”
- 決定著CALayer身上的哪個點會在position屬性所指的位置
- 以自己的左上角為原點(0, 0)
- 它的x湾笛、y取值范圍都是0~1,默認值為(0.5, 0.5)
<b> UIView的center和layer的position是一個點</br>
position和anchorPoint 點重合</b>
<h5>隱式動畫</h5>
- 每一個UIView內(nèi)部都默認關(guān)聯(lián)著一個CALayer闰歪,我們可用稱這個Layer為Root Layer(根層)
- 所有的非RootLayer嚎研,也就是手動創(chuàng)建的CALayer對象,都存在著隱式動畫
- 什么是隱式動畫库倘?
- 當對非RootLayer的部分屬性進行修改時临扮,默認會自動產(chǎn)生一些動畫效果
- 而這些屬性稱為AnimatableProperties(可動畫屬性)
- 列舉幾個常見的AnimatableProperties:
- bounds:用于設(shè)置CALayer的寬度和高度。修改這個屬性會產(chǎn)生縮放動畫
- backgroundColor:用于設(shè)置CALayer的背景色教翩。修改這個屬性會產(chǎn)生背景色的漸變動畫
- position:用于設(shè)置CALayer的位置杆勇。修改這個屬性會產(chǎn)生平移動畫
- l可以通過動畫事務(wù)(CATransaction)關(guān)閉默認的隱式動畫效果
// 只有非根層才有隱式動畫(自己手動創(chuàng)建)
[CATransaction begin];
[CATransaction setAnimationDuration: 2.0];
[CATransaction setDisableActions:YES];
[CATransaction commit];
<b>掛鐘案例</b>
// 在storyboard中拖一個UIImageView并確定寬高相同,然后拖線饱亿,然后添加圖片
@property (weak, nonatomic) IBOutlet UIImageView *clockView;
/** 當前的秒針 */
@property (nonatomic, strong) CALayer *secondLayer;
/** 當前的分針 */
@property (nonatomic, strong) CALayer *minuteLayer;
/** 當前的時針 */
@property (nonatomic, strong) CALayer *hourLayer;
// 代碼中用到的宏
//每一秒旋轉(zhuǎn)的度數(shù)
#define perSecondAngle 6
//每一分旋轉(zhuǎn)的度數(shù)
#define perMinuteAngle 6
//每一分旋轉(zhuǎn)的度數(shù)
#define perHourAngle 30
// 每一分鐘蚜退,時針旋轉(zhuǎn)的角度
#define perMinuteWithHourRotateAngle 0.5
// 角度轉(zhuǎn)弧度的宏
#define angle2radian(angle) ((angle) / 180.0 * M_PI)
- (void)viewDidLoad {
[super viewDidLoad];
[self setHourLayer];
[self setMinuteLayer];
[self setSecondLayer];
[NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(timeChange) userInfo:nil repeats:YES];
// 為了防止剛開始,秒針跳一下彪笼,在加載的時候就調(diào)用一次钻注,
[self timeChange];
}
- (void)timeChange {
NSCalendar *calendar = [NSCalendar currentCalendar];
// components: 是日歷的組件, 年配猫,月幅恋,日,時泵肄,分捆交,秒
//fromDate: 從什么時間開始獲取
NSDateComponents *dateComponents = [calendar components:NSCalendarUnitSecond | NSCalendarUnitMinute | NSCalendarUnitHour fromDate:[NSDate date]];
// 獲取當前是多少秒
NSInteger currentSecond = dateComponents.second + 1;
// 秒針開始旋轉(zhuǎn)
// 計算秒針當前旋轉(zhuǎn)的角度
// angle = 當前多少秒 * 每一秒旋轉(zhuǎn)的角度
CGFloat secondAngle = currentSecond * perSecondAngle;
self.secondLayer.transform = CATransform3DMakeRotation(angle2radian(secondAngle), 0, 0, 1);
// 獲取當前是多少分
NSInteger currentMinute = dateComponents.minute;
// 分針開始旋轉(zhuǎn)
// 計算秒針當前旋轉(zhuǎn)的角度
// angle = 當前多少分 * 每一分旋轉(zhuǎn)的角度
CGFloat minuteAngle = currentMinute * perMinuteAngle;
self.minuteLayer.transform = CATransform3DMakeRotation(angle2radian(minuteAngle), 0, 0, 1);
// 獲取當前是多少小時
NSInteger currentHour = dateComponents.hour;
// 分針開始旋轉(zhuǎn)
// 計算秒針當前旋轉(zhuǎn)的角度
// angle = 當前多少小時 * 每一小時旋轉(zhuǎn)的角度
CGFloat hourAngle = currentHour * perHourAngle + currentMinute * perMinuteWithHourRotateAngle;
self.hourLayer.transform = CATransform3DMakeRotation(angle2radian(hourAngle), 0, 0, 1);
}
// // 添加秒針
- (void)setSecondLayer {
CALayer *secondLayer = [CALayer layer];
secondLayer.bounds = CGRectMake(0, 0, 1, 80);
secondLayer.backgroundColor = [UIColor redColor].CGColor;
secondLayer.anchorPoint = CGPointMake(0.5, 1);
secondLayer.position = CGPointMake(self.clockView.bounds.size.width * 0.5, self.clockView.bounds.size.height * 0.5);
[self.clockView.layer addSublayer:secondLayer];
self.secondLayer = secondLayer;
}
// // 添加分針
- (void)setMinuteLayer {
CALayer *minuteLayer = [CALayer layer];
minuteLayer.bounds = CGRectMake(0, 0, 2, 70);
minuteLayer.backgroundColor = [UIColor blackColor].CGColor;
minuteLayer.cornerRadius = 1.5;
minuteLayer.anchorPoint = CGPointMake(0.5, 1);
minuteLayer.position = CGPointMake(self.clockView.bounds.size.width * 0.5, self.clockView.bounds.size.height * 0.5);
[self.clockView.layer addSublayer:minuteLayer];
self.minuteLayer = minuteLayer;
}
// // 添加時針
- (void)setHourLayer {
CALayer *hourLayer = [CALayer layer];
hourLayer.bounds = CGRectMake(0, 0, 3, 50);
hourLayer.backgroundColor = [UIColor blackColor].CGColor;
hourLayer.cornerRadius = 1.5;
hourLayer.anchorPoint = CGPointMake(0.5, 1);
hourLayer.position = CGPointMake(self.clockView.bounds.size.width * 0.5, self.clockView.bounds.size.height * 0.5);
[self.clockView.layer addSublayer:hourLayer];
self.hourLayer = hourLayer;
}
<h5>Core Animation</h5>
- Core Animation淑翼,中文翻譯為核心動畫,它是一組非常強大的動畫處理API品追,使用它能做出非常炫麗的動畫效果玄括,而且往往是事半功倍。也就是說肉瓦,使用少量的代碼就可以實現(xiàn)非常強大的功能惠豺。
- Core Animation可以用在Mac OS X和iOS平臺。
- Core Animation的動畫執(zhí)行過程都是在后臺操作的风宁,不會阻塞主線程洁墙。
- 要注意的是,Core Animation是直接作用在CALayer上的戒财,并非UIView热监。
- 喬幫主在2007年的WWDC大會上親自為你演示Core Animation的強大:點擊查看視頻
<h5>核心動畫繼承結(jié)構(gòu)</h5>
<b>注意:圖中的黑色虛線代表“繼承”某個類,紅色虛線代表“遵守”某個協(xié)議</b>
<h5>Core Animation的使用步驟</h5>
- 如果不是xcode5之后的版本饮寞,使用它需要先添加QuartzCore.framework和引入對應(yīng)的框架<QuartzCore/QuartzCore.h>
- 開發(fā)步驟:
- 1.首先得有CALayer
- 2.初始化一個CAAnimation對象孝扛,并設(shè)置一些動畫相關(guān)屬性
- 3.通過調(diào)用CALayer的addAnimation:forKey:方法,增加CAAnimation對象到CALayer中幽崩,這樣就能開始執(zhí)行動畫了
- 4.通過調(diào)用CALayer的removeAnimationForKey:方法可以停止CALayer中的動畫
<h5>CAAnimation——簡介</h5>
- CAAnimation是所有動畫對象的父類苦始,負責控制動畫的持續(xù)時間和速度,是個抽象類慌申,不能直接使用陌选,應(yīng)該使用它具體的子類
- 屬性說明:(紅色代表來自CAMediaTiming協(xié)議的屬性)
-
duration
:動畫的持續(xù)時間 -
repeatCount
:重復次數(shù),無限循環(huán)可以設(shè)置<b>HUGE_VALF</b>或者<b>MAXFLOAT</b> -
repeatDuration
:重復時間 - removedOnCompletion:默認為YES蹄溉,代表動畫執(zhí)行完畢后就從圖層上移除咨油,圖形會恢復到動畫執(zhí)行前的狀態(tài)。<b>如果想讓圖層保持顯示動畫執(zhí)行后的狀態(tài)柒爵,那就設(shè)置為NO役电,不過還要設(shè)置fillMode為kCAFillModeForwards</b>
-
fillMode
:決定當前對象在非active時間段的行為。比如動畫開始之前或者動畫結(jié)束之后 -
beginTime
:可以用來設(shè)置動畫延遲執(zhí)行時間棉胀,若想延遲2s法瑟,就設(shè)置為CACurrentMediaTime()+2,<b>CACurrentMediaTime()</b>為圖層的當前時間 - timingFunction:速度控制函數(shù)唁奢,控制動畫運行的節(jié)奏
- delegate:動畫代理
-
<b>CAAnimation——動畫填充模式</b>
- fillMode屬性值(要想fillMode有效霎挟,最好設(shè)置removedOnCompletion = NO)
-
kCAFillModeRemoved
這個是默認值,也就是說當動畫開始前和動畫結(jié)束后驮瞧,動畫對layer都沒有影響氓扛,動畫結(jié)束后枯芬,layer會恢復到之前的狀態(tài) -
kCAFillModeForwards
當動畫結(jié)束后论笔,layer會一直保持著動畫最后的狀態(tài) -
kCAFillModeBackwards
在動畫開始前采郎,只需要將動畫加入了一個layer,layer便立即進入動畫的初始狀態(tài)并等待動畫開始狂魔。 -
kCAFillModeBoth
這個其實就是上面兩個的合成.動畫加入后開始之前蒜埋,layer便處于動畫初始狀態(tài),動畫結(jié)束后layer保持動畫最后的狀態(tài)
-
<b>CAAnimation——速度控制函數(shù)</b>
- 速度控制函數(shù)(CAMediaTimingFunction)
- 1.kCAMediaTimingFunctionLinear(線性):勻速最楷,給你一個相對靜態(tài)的感覺
- 2.kCAMediaTimingFunctionEaseIn(漸進):動畫緩慢進入整份,然后加速離開
- 3.kCAMediaTimingFunctionEaseOut(漸出):動畫全速進入,然后減速的到達目的地
- 4.kCAMediaTimingFunctionEaseInEaseOut(漸進漸出):動畫緩慢的進入籽孙,中間加速烈评,然后減速的到達目的地。這個是默認的動畫行為犯建。
<b>CAAnimation——動畫代理方法</b>
- CAAnimation在分類中定義了代理方法
@interfaceNSObject(CAAnimationDelegate)
/*Called when the animation begins its active duration. */
-(void)animationDidStart:(CAAnimation*)anim;
/*Called when the animation either completes its active duration or
* is removed from the object it is attached to(i.e. the layer). 'flag'
* is true if the animation reached the end ofits active duration
* without being removed. */
-(void)animationDidStop:(CAAnimation*)animfinished:(BOOL)flag;
@end
<h5>CABasicAnimation(基礎(chǔ)動畫)基本使用</h5>
簡單心跳制作
// storyboard中拖一個200*200的ImageView讲冠,并拖線
@property (weak, nonatomic) IBOutlet UIImageView *imageV;
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
// 1.創(chuàng)建動畫對象
CABasicAnimation *basicAnimation = [CABasicAnimation animation];
// 2.設(shè)置動畫屬性值
basicAnimation.keyPath = @"transform.scale";
basicAnimation.toValue = @0;
// 設(shè)置動畫執(zhí)行的次數(shù)
basicAnimation.repeatCount = MAXFLOAT;
// 設(shè)置動畫執(zhí)行長度
basicAnimation.duration = 1;
// 自動翻轉(zhuǎn)(怎么樣去,怎么樣回來)
basicAnimation.autoreverses = YES;
/**
// 3.添加動畫
@param CAAnimation 動畫對象
@param NSString (forKey)添加動畫組需要用到的標識
*/
[self.imageV.layer addAnimation:basicAnimation forKey:nil];
}
呈現(xiàn)效果:
<h5>CAKeyframeAnimation(幀動畫)基本使用</h5>
簡單制作卸載程序的抖動效果
// 1.第一種簡單使用适瓦,values——
/** 角度轉(zhuǎn)弧度 */
#define angle2radian(angle) ((angle) / 180.0 * M_PI)
@property (weak, nonatomic) IBOutlet UIImageView *iconV;
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
// 1.創(chuàng)建動畫
CAKeyframeAnimation *keyframeAnimation = [CAKeyframeAnimation animation];
// 2.設(shè)置動畫屬性值
keyframeAnimation.keyPath = @"transform.rotation";
keyframeAnimation.values = @[@(angle2radian(-5)), @(angle2radian(5)), @(angle2radian(-5))];
keyframeAnimation.repeatCount = MAXFLOAT;
keyframeAnimation.duration = 0.2;
// keyframeAnimation.autoreverses = YES;
[self.iconV.layer addAnimation:keyframeAnimation forKey:nil];
}
呈現(xiàn)效果:
// 2.第二種簡單使用竿开,path——
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
// 1.創(chuàng)建動畫
CAKeyframeAnimation *keyframeAnimation = [CAKeyframeAnimation animation];
keyframeAnimation.duration = 2;
keyframeAnimation.autoreverses = YES;
keyframeAnimation.repeatCount = MAXFLOAT;
UIBezierPath *path = [UIBezierPath bezierPath];
[path moveToPoint:CGPointMake(50, 70)];
[path addLineToPoint:CGPointMake(300, 100)];
[path addLineToPoint:CGPointMake(100, 90)];
keyframeAnimation.keyPath = @"position";
keyframeAnimation.path = path.CGPath;
[self.iconV.layer addAnimation:keyframeAnimation forKey:nil];
}
呈現(xiàn)效果:
<h5>CATransition(轉(zhuǎn)場動畫)基本使用</h5>
// storyboard創(chuàng)建ImageView設(shè)置寬高,并拖線
@property (weak, nonatomic) IBOutlet UIImageView *photoV;
static int _i = 0;
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
// 轉(zhuǎn)場代碼和轉(zhuǎn)場動畫必須得在同一個方法中
// // 轉(zhuǎn)場代碼
_i++;
if (_i == 5) {
_i = 0;
}
NSString *imageName = [NSString stringWithFormat:@"%d", _i];
self.photoV.image = [UIImage imageNamed:imageName];
// // 轉(zhuǎn)場動畫
// 添加動畫
CATransition *transitionAnimation = [CATransition animation];
// 設(shè)置轉(zhuǎn)場動畫
transitionAnimation.type = @"rippleEffect";
// 設(shè)置動畫的起始位置 ------+++------
transitionAnimation.startProgress = 0.3;
// 設(shè)置動畫的結(jié)束位置 ------+++------
transitionAnimation.endProgress = 0.5;
transitionAnimation.duration = 1;
[self.photoV.layer addAnimation:transitionAnimation forKey:nil];
}
呈現(xiàn)效果:
<b>轉(zhuǎn)場動畫過渡效果</b>
類型字符串 | 效果說明 | 關(guān)鍵字 | 方向 |
---|---|---|---|
fade | 交叉淡化過渡 | YES | |
push | 新視圖把舊視圖推出去 | YES | |
moveIn | 新視圖移到舊視圖上面 | YES | |
reveal | 將舊視圖移開,顯示下面的新視圖 | YES | |
cube | 立方體翻滾效果 | ||
oglFlip | 上下左右翻轉(zhuǎn)效果 | ||
suckEffect | 收縮效果玻熙,如一塊布被抽走 | NO | |
rippleEffect | 水滴效果 | NO | |
pageCurl | 向上翻頁效果 | ||
pageUnCurl | 向下翻頁效果 | ||
cameraIrisHollowOpen | 相機鏡頭打開效果 | NO | |
cameraIrisHollowClose | 相機鏡頭關(guān)閉效果 | NO |
<h5>CAAnimationGroup(動畫組)基本使用</h5>
@property (weak, nonatomic) IBOutlet UIView *colorView;
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
CABasicAnimation *basicAnimation01 = [CABasicAnimation animation];
basicAnimation01.keyPath = @"position.y";
basicAnimation01.toValue = @300;
// basicAnimation01.removedOnCompletion = NO;
// basicAnimation01.fillMode = kCAFillModeForwards;
//
// [self.colorView.layer addAnimation:basicAnimation01 forKey:nil];
CABasicAnimation *basicAnimation02 = [CABasicAnimation animation];
basicAnimation02.keyPath = @"transform.scale";
basicAnimation02.toValue = @0.5;
// basicAnimation02.removedOnCompletion = NO;
// basicAnimation02.fillMode = kCAFillModeForwards;
//
// [self.colorView.layer addAnimation:basicAnimation02 forKey:nil];
CAAnimationGroup *animationGroup = [CAAnimationGroup animation];
// 會自動執(zhí)行animations數(shù)組當中的所有動畫對象
animationGroup.animations = @[basicAnimation01, basicAnimation02];
animationGroup.removedOnCompletion = NO;
animationGroup.fillMode = kCAFillModeForwards;
[self.colorView.layer addAnimation:animationGroup forKey:nil];
}
呈現(xiàn)效果:
<h5>UIView與核心動畫區(qū)別</h5>
- 核心動畫只作用在layer上
- 核心動畫看到的都是假象否彩,它并沒有修改UIView的真實位置
<b>什么時候使用核心動畫</b>
- 當不需要與用戶進行交互的時候,使用核心動畫
- 當需要根據(jù)路徑做動畫的時候嗦随,使用核心動畫
- 當作轉(zhuǎn)場動畫時列荔,使用核心動畫(轉(zhuǎn)場類型比較多)