使用最經(jīng)典的一張圖來介紹一下動(dòng)畫抽象類CAAnimation.同NSOperation一樣,都是抽象類胁澳,并不具備封裝操作的能力该互,必須使用其子類。
CAAnimation.png
CAAnimationGroup:動(dòng)畫組韭畸,多個(gè)動(dòng)畫同時(shí)執(zhí)行宇智。
CABasicAnimation:基本動(dòng)畫,可以做到平移胰丁、縮放随橘、旋轉(zhuǎn)
CAKeyframeAnimation:幀動(dòng)畫,動(dòng)畫可以分成幾個(gè)過程執(zhí)行
CATransition:轉(zhuǎn)場動(dòng)畫锦庸,可以實(shí)現(xiàn)兩個(gè)界面或控件的推出机蔗、翻頁等效果。
CABasicAnimation:基本動(dòng)畫
// 正方形按鈕控件
@property (weak, nonatomic) IBOutlet UIButton *basicBtn;
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view.
// CABasicAnimation是CAPropertyAnimation的子類, CAPropertyAnimation有一個(gè)字符串類型的keyPath屬性
// keyPath內(nèi)容是CALayer的可動(dòng)畫Animatable屬性,我們可以指定CALayer的某個(gè)屬性名為keyPath甘萧,并且對CALayer的這個(gè)屬性的值進(jìn)行修改萝嘁,達(dá)到相應(yīng)的動(dòng)畫效果。
// 例如:指定keyPath = @"position"扬卷,就會修改CALayer的position屬性的值牙言,- > 可以實(shí)現(xiàn)平移的動(dòng)畫效果
// 如果fillMode=kCAFillModeForwards同時(shí)removedOnComletion=NO,那么在動(dòng)畫執(zhí)行完畢后怪得,圖層會保持顯示動(dòng)畫執(zhí)行后的狀態(tài)咱枉。但在實(shí)質(zhì)上,圖層的屬性值還是動(dòng)畫執(zhí)行前的初始值徒恋,并沒有真正被改變蚕断。
// http://www.reibang.com/p/3c0ed03a5816
// [self basicAnimationWithbounds];
[self basicAnimationWithRotation];
// 平移可使用 keyPath = @"position";
}
- (void)basicAnimationWithbounds
{
CABasicAnimation *basic = [CABasicAnimation animationWithKeyPath:@"bounds"];
basic.duration = 2.0;
// basic.fromValue = [NSValue valueWithCGRect:CGRectMake(0, 0, 100, 100)];
basic.toValue = [NSValue valueWithCGRect:CGRectMake(0, 0, ScreenW, ScreenW)];
// basic.fillMode = kCAFillModeForwards;
// basic.removedOnCompletion = NO;
basic.repeatCount = MAXFLOAT;
[self.basicBtn.layer addAnimation:basic forKey:nil];
}
- (void)basicAnimationWithRotation
{
// [self.basicBtn.layer removeAllAnimations];
CABasicAnimation *basic = [CABasicAnimation animationWithKeyPath:@"transform"];
basic.duration = 4.0;
basic.toValue = [NSValue valueWithCATransform3D:CATransform3DMakeRotation(M_PI * 0.5, 0, 0, 1)];
basic.fillMode = kCAFillModeForwards;
basic.removedOnCompletion = NO;
// basic.repeatCount = MAXFLOAT;
[self.basicBtn.layer addAnimation:basic forKey:nil];
}
CAAnimationGroup:動(dòng)畫組
@property (weak, nonatomic) IBOutlet UIButton *groupBtn;
- (void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
[self caanimationGroup];
}
- (void)caanimationGroup
{
CAAnimationGroup *groupAnimation = [CAAnimationGroup animation];
CABasicAnimation *basic1 = [CABasicAnimation animationWithKeyPath:@"bounds"];
// basic1.duration = 2.0;
// basic.fromValue = [NSValue valueWithCGRect:CGRectMake(0, 0, 100, 100)];
basic1.toValue = [NSValue valueWithCGRect:CGRectMake(0, 0, ScreenW, ScreenW)];
// basic.fillMode = kCAFillModeForwards;
// basic.removedOnCompletion = NO;
basic1.repeatCount = MAXFLOAT;
CABasicAnimation *basic2 = [CABasicAnimation animationWithKeyPath:@"transform"];
// basic2.duration = 3.0;
basic2.toValue = [NSValue valueWithCATransform3D:CATransform3DMakeRotation(M_PI * 0.5, 0, 0, 1)];
// basic2.fillMode = kCAFillModeForwards;
// basic2.removedOnCompletion = NO;
// basic.repeatCount = MAXFLOAT;
CABasicAnimation *basic3 = [CABasicAnimation animation];
basic3.keyPath = @"position";
CGPoint center = self.groupBtn.center;
center.y += 300;
basic3.toValue = [NSValue valueWithCGPoint:center];
groupAnimation.animations = @[basic1,basic2];
groupAnimation.duration = 0.5;
// groupAnimation.removedOnCompletion = NO;
// groupAnimation.fillMode = kCAFillModeForwards;
groupAnimation.repeatCount = MAXFLOAT;
[self.groupBtn.layer addAnimation:groupAnimation forKey:nil];
}
CATransition:轉(zhuǎn)場動(dòng)畫
// 在觸摸事件或其他事件的方法中實(shí)現(xiàn),在展示圖片是入挣,為imageview控件添加轉(zhuǎn)場動(dòng)畫基括,開發(fā)中在歡迎界面推向主界面時(shí),我們一般使用的是轉(zhuǎn)場動(dòng)畫
self.centerImage.image = [UIImage imageNamed:[NSString stringWithFormat:@"meinv%d.jpg",self.imageIndex]];
CATransition *trans = [CATransition animation];
trans.type = @"pageCurl";
trans.subtype = kCATransitionFromRight;
trans.duration = 1.0;
[self.centerImage.layer addAnimation:trans forKey:nil];
CAKeyframeAnimation:幀動(dòng)畫
@property (weak, nonatomic) IBOutlet UIButton *keyFrameBtn;
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view.
[self keyframeAnimation];
}
- (void)keyframeAnimation
{
CAKeyframeAnimation *keyframeAnimation = [CAKeyframeAnimation animation];
keyframeAnimation.keyPath = @"transform";
keyframeAnimation.duration = 1.0;
NSValue *value1 = [NSValue valueWithCATransform3D:CATransform3DMakeRotation(M_PI * 0.5, 0, 0, 1)];
NSValue *value2 = [NSValue valueWithCATransform3D:CATransform3DMakeRotation(M_PI * 1, 0, 0, 1)];
NSValue *value3 = [NSValue valueWithCATransform3D:CATransform3DMakeRotation(M_PI * 1.5, 0, 0, 1)];
NSValue *value4 = [NSValue valueWithCATransform3D:CATransform3DMakeRotation(M_PI * 2, 0, 0, 1)];
keyframeAnimation.values = @[value1,value2,value3,value4];
keyframeAnimation.fillMode = kCAFillModeForwards;
// 如果fillMode=kCAFillModeForwards同時(shí)removedOnComletion=NO财岔,那么在動(dòng)畫執(zhí)行完畢后风皿,圖層會保持顯示動(dòng)畫執(zhí)行后的狀態(tài)河爹。但在實(shí)質(zhì)上,圖層的屬性值還是動(dòng)畫執(zhí)行前的初始值桐款,并沒有真正被改變咸这。
keyframeAnimation.removedOnCompletion = NO;
keyframeAnimation.repeatCount = MAXFLOAT;
[self.keyFrameBtn.layer addAnimation:keyframeAnimation forKey:nil];
}