最近写项目发现越来越没动力了,
底层的东西实在太让人头疼了。。。
所幸研究一点好玩的东西~~那就是特效!!!
biubiubibuiubiu~~~~~~
好了废话不说 开始讲解 各种常见的不常见的甚至没见过的 iOS自带特效!
1. 基础动画篇
基础动画-位移
/**
* 位移动画演示
*/
-(void)positionAnimation{
//使用CABasicAnimation创建基础动画
CABasicAnimation *anima = [CABasicAnimation animationWithKeyPath:@"position"];
anima.fromValue = [NSValue valueWithCGPoint:CGPointMake(0, SCREEN_HEIGHT/2-75)];
anima.toValue = [NSValue valueWithCGPoint:CGPointMake(SCREEN_WIDTH, SCREEN_HEIGHT/2-75)];
anima.duration = 1.0f;
// 如果fillMode=kCAFillModeForwards和removedOnComletion=NO,那么在动画执行完毕后,图层会保持显示动画执行后的状态。但在实质上,图层的属性值还是动画执行前的初始值,并没有真正被改变。
//anima.fillMode = kCAFillModeForwards;
//anima.removedOnCompletion = NO;
anima.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseIn];
[_demoView.layer addAnimation:anima forKey:@"positionAnimation"];
//使用UIView Animation 代码块调用
// _demoView.frame = CGRectMake(0, SCREEN_HEIGHT/2-50, 50, 50);
// [UIView animateWithDuration:1.0f animations:^{
// _demoView.frame = CGRectMake(SCREEN_WIDTH, SCREEN_HEIGHT/2-50, 50, 50);
// } completion:^(BOOL finished) {
// _demoView.frame = CGRectMake(SCREEN_WIDTH/2-25, SCREEN_HEIGHT/2-50, 50, 50);
// }];
//
//使用UIView [begin,commit]模式
// _demoView.frame = CGRectMake(0, SCREEN_HEIGHT/2-50, 50, 50);
// [UIView beginAnimations:nil context:nil];
// [UIView setAnimationDuration:1.0f];
// _demoView.frame = CGRectMake(SCREEN_WIDTH, SCREEN_HEIGHT/2-50, 50, 50);
// [UIView commitAnimations];
}
基础动画-透明度
/**
* 透明度动画
*/
-(void)opacityAniamtion{
CABasicAnimation *anima = [CABasicAnimation animationWithKeyPath:@"opacity"];
anima.fromValue = [NSNumber numberWithFloat:1.0f];
anima.toValue = [NSNumber numberWithFloat:0.2f];
anima.duration = 1.0f;
[_demoView.layer addAnimation:anima forKey:@"opacityAniamtion"];
}
基础动画-缩放
/**
* 缩放动画
*/
-(void)scaleAnimation{
// CABasicAnimation *anima = [CABasicAnimation animationWithKeyPath:@"bounds"];
// anima.toValue = [NSValue valueWithCGRect:CGRectMake(0, 0, 200, 200)];
// anima.duration = 1.0f;
// [_demoView.layer addAnimation:anima forKey:@"scaleAnimation"];
CABasicAnimation *anima = [CABasicAnimation animationWithKeyPath:@"transform.scale"];//同上
anima.toValue = [NSNumber numberWithFloat:2.0f];
anima.duration = 1.0f;
[_demoView.layer addAnimation:anima forKey:@"scaleAnimation"];
// CABasicAnimation *anima = [CABasicAnimation animationWithKeyPath:@"transform.scale.x"];
// anima.toValue = [NSNumber numberWithFloat:0.2f];
// anima.duration = 1.0f;
// [_demoView.layer addAnimation:anima forKey:@"scaleAnimation"];
}
基础动画-旋转
/**
* 旋转动画
*/
-(void)rotateAnimation{
CABasicAnimation *anima = [CABasicAnimation animationWithKeyPath:@"transform.rotation.z"];//绕着z轴为矢量,进行旋转(@"transform.rotation.z"==@@"transform.rotation")
anima.toValue = [NSNumber numberWithFloat:M_PI];
anima.duration = 1.0f;
[_demoView.layer addAnimation:anima forKey:@"rotateAnimation"];
// //valueWithCATransform3D作用与layer
// CABasicAnimation *anima = [CABasicAnimation animationWithKeyPath:@"transform"];
// anima.toValue = [NSValue valueWithCATransform3D:CATransform3DMakeRotation(M_PI, 0, 0, 1)];//绕着矢量(x,y,z)旋转
// anima.duration = 1.0f;
// //anima.repeatCount = MAXFLOAT;
// [_demoView.layer addAnimation:anima forKey:@"rotateAnimation"];
// //CGAffineTransform作用与View
// _demoView.transform = CGAffineTransformMakeRotation(0);
// [UIView animateWithDuration:1.0f animations:^{
// _demoView.transform = CGAffineTransformMakeRotation(M_PI);
// } completion:^(BOOL finished) {
//
// }];
}
基础动画-变色
./**
* 背景色变化动画
*/
-(void)backgroundAnimation{
CABasicAnimation *anima = [CABasicAnimation animationWithKeyPath:@"backgroundColor"];
anima.toValue =(id) [UIColor greenColor].CGColor;
anima.duration = 1.0f;
[_demoView.layer addAnimation:anima forKey:@"backgroundAnimation"];
}
2 帧动画
帧动画-关键帧
/**
* 关键帧动画
*/
-(void)keyFrameAnimation{
CAKeyframeAnimation *anima = [CAKeyframeAnimation animationWithKeyPath:@"position"];
NSValue *value0 = [NSValue valueWithCGPoint:CGPointMake(0, SCREEN_HEIGHT/2-50)];
NSValue *value1 = [NSValue valueWithCGPoint:CGPointMake(SCREEN_WIDTH/3, SCREEN_HEIGHT/2-50)];
NSValue *value2 = [NSValue valueWithCGPoint:CGPointMake(SCREEN_WIDTH/3, SCREEN_HEIGHT/2+50)];
NSValue *value3 = [NSValue valueWithCGPoint:CGPointMake(SCREEN_WIDTH*2/3, SCREEN_HEIGHT/2+50)];
NSValue *value4 = [NSValue valueWithCGPoint:CGPointMake(SCREEN_WIDTH*2/3, SCREEN_HEIGHT/2-50)];
NSValue *value5 = [NSValue valueWithCGPoint:CGPointMake(SCREEN_WIDTH, SCREEN_HEIGHT/2-50)];
anima.values = [NSArray arrayWithObjects:value0,value1,value2,value3,value4,value5, nil];
anima.duration = 2.0f;
anima.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseOut];//设置动画的节奏
anima.delegate = self;//设置代理,可以检测动画的开始和结束
[_demoView.layer addAnimation:anima forKey:@"keyFrameAnimation"];
}
-(void)animationDidStart:(CAAnimation *)anim{
NSLog(@"开始动画");
}
-(void)animationDidStop:(CAAnimation *)anim finished:(BOOL)flag{
NSLog(@"结束动画");
}
帧动画-路径
/**
* path动画
*/
-(void)pathAnimation{
CAKeyframeAnimation *anima = [CAKeyframeAnimation animationWithKeyPath:@"position"];
UIBezierPath *path = [UIBezierPath bezierPathWithOvalInRect:CGRectMake(SCREEN_WIDTH/2-100, SCREEN_HEIGHT/2-100, 200, 200)];
anima.path = path.CGPath;
anima.duration = 2.0f;
[_demoView.layer addAnimation:anima forKey:@"pathAnimation"];
}
帧动画-抖动
/**
* 抖动效果
*/
-(void)shakeAnimation{
CAKeyframeAnimation *anima = [CAKeyframeAnimation animationWithKeyPath:@"transform.rotation"];//在这里@"transform.rotation"==@"transform.rotation.z"
NSValue *value1 = [NSNumber numberWithFloat:-M_PI/180*4];
NSValue *value2 = [NSNumber numberWithFloat:M_PI/180*4];
NSValue *value3 = [NSNumber numberWithFloat:-M_PI/180*4];
anima.values = @[value1,value2,value3];
anima.repeatCount = MAXFLOAT;
[_demoView.layer addAnimation:anima forKey:@"shakeAnimation"];
}
注意:抖动最好加一个timer时间判断 不然她会抖到你手机没电!
帧动画-弹来弹去
//弹来弹去
-(void)calculationAnimation
{
//需要实现的帧动画
CAKeyframeAnimation *animation = [CAKeyframeAnimation animation];
animation.keyPath = @"transform.scale";
animation.values = @[@1.0,@1.3,@0.9,@1.15,@0.95,@1.02,@1.0];
animation.duration = 1;
animation.calculationMode = kCAAnimationCubic;
//把动画添加上去
[_demoView.layer addAnimation:animation forKey:nil];
}
这个动画 是一个我个人很喜欢的动画 可能这么看 你感觉不出 他有什么用? 这里附加一个实例的动画 我想你们会收到启发的
3 动画简单组合
组合动画-同时进行
-(void)groupAnimation1{
// //位移动画
CAKeyframeAnimation *anima1 = [CAKeyframeAnimation animationWithKeyPath:@"position"];
NSValue *value0 = [NSValue valueWithCGPoint:CGPointMake(0, SCREEN_HEIGHT/2-50)];
NSValue *value1 = [NSValue valueWithCGPoint:CGPointMake(SCREEN_WIDTH/3, SCREEN_HEIGHT/2-50)];
NSValue *value2 = [NSValue valueWithCGPoint:CGPointMake(SCREEN_WIDTH/3, SCREEN_HEIGHT/2+50)];
NSValue *value3 = [NSValue valueWithCGPoint:CGPointMake(SCREEN_WIDTH*2/3, SCREEN_HEIGHT/2+50)];
NSValue *value4 = [NSValue valueWithCGPoint:CGPointMake(SCREEN_WIDTH*2/3, SCREEN_HEIGHT/2-50)];
NSValue *value5 = [NSValue valueWithCGPoint:CGPointMake(SCREEN_WIDTH, SCREEN_HEIGHT/2-50)];
anima1.values = [NSArray arrayWithObjects:value0,value1,value2,value3,value4,value5, nil];
//缩放动画
CABasicAnimation *anima2 = [CABasicAnimation animationWithKeyPath:@"transform.scale"];
anima2.fromValue = [NSNumber numberWithFloat:0.8f];
anima2.toValue = [NSNumber numberWithFloat:2.0f];
//旋转动画
CABasicAnimation *anima3 = [CABasicAnimation animationWithKeyPath:@"transform.rotation"];
anima3.toValue = [NSNumber numberWithFloat:M_PI*4];
//组动画
CAAnimationGroup *groupAnimation = [CAAnimationGroup animation];
groupAnimation.animations = [NSArray arrayWithObjects:anima1,anima2,anima3, nil];
groupAnimation.duration = 4.0f;
[_demoView.layer addAnimation:groupAnimation forKey:@"groupAnimation"];
//-------------如下,使用三个animation不分装成group,只是把他们添加到layer,也有组动画的效果。-------------
// //位移动画
// CAKeyframeAnimation *anima1 = [CAKeyframeAnimation animationWithKeyPath:@"position"];
// NSValue *value0 = [NSValue valueWithCGPoint:CGPointMake(0, SCREEN_HEIGHT/2-50)];
// NSValue *value1 = [NSValue valueWithCGPoint:CGPointMake(SCREEN_WIDTH/3, SCREEN_HEIGHT/2-50)];
// NSValue *value2 = [NSValue valueWithCGPoint:CGPointMake(SCREEN_WIDTH/3, SCREEN_HEIGHT/2+50)];
// NSValue *value3 = [NSValue valueWithCGPoint:CGPointMake(SCREEN_WIDTH*2/3, SCREEN_HEIGHT/2+50)];
// NSValue *value4 = [NSValue valueWithCGPoint:CGPointMake(SCREEN_WIDTH*2/3, SCREEN_HEIGHT/2-50)];
// NSValue *value5 = [NSValue valueWithCGPoint:CGPointMake(SCREEN_WIDTH, SCREEN_HEIGHT/2-50)];
// anima1.values = [NSArray arrayWithObjects:value0,value1,value2,value3,value4,value5, nil];
// anima1.duration = 4.0f;
// [_demoView.layer addAnimation:anima1 forKey:@"aa"];
//
// //缩放动画
// CABasicAnimation *anima2 = [CABasicAnimation animationWithKeyPath:@"transform.scale"];
// anima2.fromValue = [NSNumber numberWithFloat:0.8f];
// anima2.toValue = [NSNumber numberWithFloat:2.0f];
// anima2.duration = 4.0f;
// [_demoView.layer addAnimation:anima2 forKey:@"bb"];
//
// //旋转动画
// CABasicAnimation *anima3 = [CABasicAnimation animationWithKeyPath:@"transform.rotation"];
// anima3.toValue = [NSNumber numberWithFloat:M_PI*4];
// anima3.duration = 4.0f;
// [_demoView.layer addAnimation:anima3 forKey:@"cc"];
}
组合动画-连续进行
/**
* 顺序执行的组动画
*/
-(void)groupAnimation2{
CFTimeInterval currentTime = CACurrentMediaTime();
//位移动画
CABasicAnimation *anima1 = [CABasicAnimation animationWithKeyPath:@"position"];
anima1.fromValue = [NSValue valueWithCGPoint:CGPointMake(0, SCREEN_HEIGHT/2-75)];
anima1.toValue = [NSValue valueWithCGPoint:CGPointMake(SCREEN_WIDTH/2, SCREEN_HEIGHT/2-75)];
anima1.beginTime = currentTime;
anima1.duration = 1.0f;
anima1.fillMode = kCAFillModeForwards;
anima1.removedOnCompletion = NO;
[_demoView.layer addAnimation:anima1 forKey:@"aa"];
//缩放动画
CABasicAnimation *anima2 = [CABasicAnimation animationWithKeyPath:@"transform.scale"];
anima2.fromValue = [NSNumber numberWithFloat:0.8f];
anima2.toValue = [NSNumber numberWithFloat:2.0f];
anima2.beginTime = currentTime+1.0f;
anima2.duration = 1.0f;
anima2.fillMode = kCAFillModeForwards;
anima2.removedOnCompletion = NO;
[_demoView.layer addAnimation:anima2 forKey:@"bb"];
//旋转动画
CABasicAnimation *anima3 = [CABasicAnimation animationWithKeyPath:@"transform.rotation"];
anima3.toValue = [NSNumber numberWithFloat:M_PI*4];
anima3.beginTime = currentTime+2.0f;
anima3.duration = 1.0f;
anima3.fillMode = kCAFillModeForwards;
anima3.removedOnCompletion = NO;
[_demoView.layer addAnimation:anima3 forKey:@"cc"];
}
4. 结束语
以上就是一些简单而且实用的 基础动画
虽然看上去gif 都挺丑的
但是我相信 如果你能把这些效果用好
不管你的app 实际内容有多少 精不精彩 至少只是一个效果 界面
就足以让你的app 发光发彩!!!
最后老规矩。
老猫在这里祝大家:永无BUG。不再加班!