在平时的开发过程中,我们为了让应用更绚丽,经常会加入一些动画效果。实现iOS漂亮的动画效果主要有两种方法,一种是UIView层面的,一种是使用CATransition,UIview只能用于一些简单的,常用的效果展现;CATransition则可以进行更低层次的控制
1.UIView
UIView的简单动画就可以满足我们的应用开发,UIView支持的动画属性包括:frame,center,bounds,transfrom,alpha,backgroundcolor等
2.CATransition
如果是将控制器内的子视图转场到另一个子视图,就将动画加入到视图控制器的图层
要令一个转场生效,要将动画添加到将要变为动画视图所附着的图层。例如在两个视图控制器之间进行转场,那就将动画添加到窗口的图层中。
动画类型
1.全局变量形式
kCATransitionFade 交叉淡化过度
kCATransitionMoveIn 新视图移动到旧视图上
kCATransitionPush 新视图把旧视图推出去
kCATransitionReveal 将旧视图移开,显示下面的新视图
2.字符串表示
fade 交叉淡化过渡
moveIn 新视图移动到旧视图上
push 新视图把旧视图推出去
reveal 将旧视图移开,显示下面的新视图
pageCurl 向上翻一页
pageUnCurl 向下翻一页
rippleEffect 滴水效果
suckEffect 收缩效果,如一块布被抽走
cube 立方体效果
oglFlip 上下翻转效果
动画的速度/节奏
kCAMediaTimingFunctionLinear 线性(匀速)
kCAMediaTimingFunctionEaseIn 先慢
kCAMediaTimingFunctionEaseOut后慢
kCAMediaTimingFunctionEaseInEaseOut先慢 后慢 中间快
kCAMediaTimingFunctionDefault默认
动画对象
隐式动画&显示动画
//生成一个layer
self.layer = [CALayer layer];
self.layer.backgroundColor = [UIColor blueColor].CGColor;
//设置layer的中心点坐标
self.layer.position = CGPointMake(100, 100);
self.layer.bounds = CGRectMake(0, 0, 100, 100);
//设置圆角
self.layer.cornerRadius = 50;
//把layer添加到view的layer上
[self.view.layer addSublayer:self.layer];
//CATransaction 事务
[CATransaction begin];
//修改隐式动画的默认时间
[CATransaction setValue:[NSNumber numberWithFloat:10.0f] forKey:kCATransactionAnimationDuration];
//通过修改属性而产生的动画,叫做隐式动画
self.layer.position = CGPointMake(300, 200);
//
[CATransaction commit];
显示动画
//CATransaction 事务
[CATransaction begin];
//关闭隐士动画效果
[CATransaction setDisableActions:YES];
//实例化一个CABasicAnimation,
CABasicAnimation *basicAnimation = [CABasicAnimation animationWithKeyPath:@"position"];
//fromValue 从那个地方开始
basicAnimation.fromValue = [NSValue valueWithCGPoint:CGPointMake(100, 100)];
//toValue 结束的位置
basicAnimation.toValue = [NSValue valueWithCGPoint:CGPointMake(300, 200)];
//duration 指定持续时间
basicAnimation.duration = 2;
//通过addAnimation显示添加的指定的动画,显式动画
[self.layer addAnimation:basicAnimation forKey:@"base"];
self.layer.position = CGPointMake(300, 200);
//
[CATransaction commit];
基本动画
//@"opacity" 修改透明度
CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"opacity"];
//透明度变换到0
animation.toValue = [NSNumber numberWithFloat:0.0f];
animation.duration = 2;
animation.repeatCount = 1;
[_myView.layer addAnimation:animation forKey:nil];
动画组
//旋转的动画
CABasicAnimation *rotationAnimation = [CABasicAnimation animationWithKeyPath:@"transform.rotation.z"];
//变换到那个值
rotationAnimation.toValue = [NSNumber numberWithFloat:(4 * M_PI)];
//周期
rotationAnimation.duration = 0.35f;
//节奏
rotationAnimation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut];
//比例动画
CABasicAnimation *scaleAnimation = [CABasicAnimation animationWithKeyPath:@"transform.scale"];
//比例变换哪个值
scaleAnimation.toValue = [NSNumber numberWithFloat:0.0];//比例变换到0缩小到0
scaleAnimation.duration = 0.35f;
scaleAnimation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut];
//动画组
CAAnimationGroup *animationGroup = [CAAnimationGroup animation];
//设置动画时间
animationGroup.duration = 0.35f;
//动画结束后,自动重新开始
animationGroup.autoreverses = YES;
//重复次数
animationGroup.repeatCount = 2;
//把两个动画同时加到动画组中
animationGroup.animations =[NSArray arrayWithObjects:rotationAnimation, scaleAnimation, nil];
//增加动画 给 _myView动画组
//如果要同时增加两个动画 先放到动画组中
[_myView.layer addAnimation:animationGroup forKey:@"animationGroup"];