真正强大的核心动画(Core Animation)

Core Animation简路径介

  • Core Animation,中文翻译为核心动画,它是一组非常强大的动画处理API,使用它能做出非常绚丽的动画效果,而且往往是事半功倍,也就是说,使用少量的代码就可以实现非常强大的功能
  • Core Animation可以用在Mac OS X和iOS平台
  • Core Animation的动画执行过程都是在后台操作的,不会堵塞主线程
  • 需要注意的是:Core Animation是直接作用在CALayer上的,并非UIView

Core Animation的使用步骤

  • 如果是Xcode5之前的版本,使用它需要先添加QuartzCore.framework和引入对应的框架
  • 开发步骤:
  • 1.首先得有CALayer
  • 2.初始化一个CAAnimation对象,并设置一些动画相关属性
  • 3.通过调用CALayer的addAnimationforKey:方法,增加CAAnimation对象到CALayer中,这样就能开始执行动画
CABasicAnimation动画
//1.生成Core Animation(它当中有很多种)
CABasicAnimation *anim = [CABasicAnimation animation];
//2.设置属性(位置属性)
anim.keyPath = @"position.x";
anim.toValue = @300;

注意:在动画完成的时候会自动删除动画,我们要制止,并且将动画停在前面的一个位置(回到原来的位置叫做后面的位置)

//是否删除动画
anim.removeOnCompletion = NO;
//将动画保存到前面的位置(fillMode枚举属性,点进去看一下)
anim.fillMode = @"forwards";
3.添加动画
[self.redView.layer addAnimation:anim forKey:nil];
  • 第一个属性:你需要添加的动画名称
  • 第二个属性:因为我们以后不止添加一个动画,所以需要给动画一个标识(这里举例子就一个,所以暂时写nil)
CAKeyframeAnimation动画(帧动画)
    //创建动画
    CAKeyframeAnimation *anim = [CAKeyframeAnimation animation];
    //设置动画属性
    anim.keyPath = @"transform.rotation";
    anim.values = @[@(angle2Rad(3)),@(angle2Rad(-3)),@(angle2Rad(3))];
    //设置执行次数
    anim.repeatCount = MAXFLOAT;
    //设置执行间隔
    anim.duration = 0.5;
    //添加动画
    [self.imageV.layer addAnimation:anim forKey:nil];
  • 此动画可以跟随路径移动
    //创建动画
    CAKeyframeAnimation *anim = [CAKeyframeAnimation animation];
    //创建路径
    UIBezierPath *path = [UIBezierPath bezierPath];
    [path moveToPoint:CGPointMake(10, 10)];
    [path addLineToPoint:CGPointMake(10, 200)];
    //设置属性(路径)
    anim.keyPath = @"position";
    anim.path = path.CGPath;
    //设置动画时间
    anim.duration = 2;
    //添加动画
    [self.imageV.layer addAnimation:anim forKey:nil];
CATransition动画(转场动画)
  • 图片的名字从1到3
//转场代码
if (_i==4) {
      _i=1;
  }
    //设置图片
      self.imageV.image = [UIImage imageNamed:[NSString stringWithFormat:@"%d",_i]];
          _i++;
 //转场代码
    //创建转场动画
    CATransition *anim = [CATransition animation];
    //设置动画样式
    anim.type = @"cube";
   //动画时长
    anim.duration =1;
    //添加动画
    [self.imageV.layer addAnimation:anim forKey:nil];

注意:转场动画和转场代码必须在同一个方法中

  • 转场动画过度效果
    1.fade:交叉淡化过渡
    2.push:新
    3.moveIn:新视图移到旧视图上面
    4.reveal:将旧视图移开,显示下面的新视图
    5.cube:立方体翻滚效果
    6.oglFlip:上下左右翻转效果
    7.suckEffect:收缩效果,如一块布被抽走
    8.rippleEffect:水滴效果
    9.pageCurl:向上翻页效果
    10.pageUnCurl:向下翻页效果
    11.cameraIrisHollowOpen:相机镜头打开效果
    12.cameraIrisHollowClose:相机镜头关闭效果
CAAnimationGroup动画(动画组)
//创建两个动画
    //第一个动画
    CABasicAnimation *anim1 = [CABasicAnimation animation];
    //设置anim1的属性
    anim1.keyPath = @"transform.scale";
    anim1.toValue = @0.5;
    //第二个动画
    CABasicAnimation *anim2 = [CABasicAnimation animation];
    //设置属性
    anim2.keyPath = @"position.y";
    anim2.toValue = @300;
    //创建动画组
    CAAnimationGroup *group = [CAAnimationGroup animation];
    //将动画添加到动画组中
    group.animations = @[anim1,anim2];
    //设置动画组的属性(让他不是默认情况并且保持在动画后)
    group.removedOnCompletion = NO;
    group.fillMode = kCAFillModeForwards;
    //添加动画组
    [self.imageV.layer addAnimation:group forKey:nil];
  • 动画组可以在需要给图片多个动画效果的时候添加在一起,之后统一设置动画时长,动画是否默认情况,保持在动画前或者后的效果,避免了写多条重复代码

属性

调用属性的时候一定要是对象.属性

  • 动画执行次数(最大)
repeatCount = MAXFOLAT;
  • 动画间隔时长(3S)
duration = 3;
  • 自动翻转(怎么去,怎么回来)
autoreverses = YES;
  • 动画开始的位置和结束的位置(0到1)
startProgress = 0.2;
endProgress = 0.5;

代理

//动画结束的时候调用

-(void)animationDidStop:(CAAnimation *)anim finished:(BOOL)flag{
}
在设置属性keypath的时候可能用到的值
可用 Key Path 示意
transform.rotation.x 按x轴旋转的弧度
transform.rotation.y 按y轴旋转的弧度
transform.rotation.z 按z轴旋转的弧度
transform.rotation 按z轴旋转的弧度, 和transform.rotation.z效果一样
transform.scale.x 在x轴按比例放大缩小
transform.scale.y 在y轴按比例放大缩小
transform.scale.z 在z轴按比例放大缩小
transform.scale 整体按比例放大缩小
transform.translation.x 沿x轴平移
transform.translation.y 沿y轴平移
transform.translation.z 沿z轴平移
transform.translation x,y 坐标均发生改变
transform CATransform3D 4xbounds4矩阵
bounds layer大小
position layer位置
anchorPoint 锚点位置
cornerRadius 圆角大小
zPosition z轴位置
删除动画
[self.dotLayer removeAllAnimations];
删除路径
[self.path removeAllPoints];
  • 注意:通过transform进行的形变,他修改的是frame,并没有修改他的center(中心)

你可能感兴趣的:(iOS-UI,iOS开发)