核心动画

核心动画
// 所有的UIView  内部都有一个layer
    // 我们所看到的view的外形 都是layer显示的
   
    // 设置按钮内部图层的 圆角
    btn.layer.cornerRadius = 50;
    // 图层的边框颜色
//    btn.layer.borderColor = [UIColor blackColor].CGColor;
//    // 图层的边框宽度
//    btn.layer.borderWidth = 5;
   
    // 阴影颜色
    btn.layer.shadowColor = [UIColor blackColor].CGColor;
    // 阴影透明度
    btn.layer.shadowOpacity = 1;
    // 阴影偏移量
    btn.layer.shadowOffset = CGSizeMake(5, 10);
    // 阴影半径
    btn.layer.shadowRadius = 7;
   
   
    // 单独创建一个图层
    CALayer *layer = [[CALayer alloc] init];
    layer.frame = CGRectMake(100, 300, 100, 100);
    layer.backgroundColor = [UIColor greenColor].CGColor;
    [self.view.layer addSublayer:layer];
#pragma mark 转场动画
- (void)bntClick
{
    CATransition * transition =[CATransition animation];
    transition.duration = 1;
    //rippleEffect 水波
    transition.type = @"cube”;方块
    transition.subtype = kCATransitionFromRight;
//两个view进行切换
    [self.view exchangeSubviewAtIndex:0 withSubviewAtIndex:1];
        [self.view.layer addAnimation:transition forKey:@"1"];
   }
事务动画
 // 事务动画:用在修改图层的一些属性上
    [CATransaction begin];
    [CATransaction setAnimationDuration:1];
   
    // 控制动画的速度 (curve)
    [CATransaction setAnimationTimingFunction:[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut]];
    //    layer.frame = CGRectMake(200, 100, 50, 50);
        // 转换
//    layer.transform = CATransform3DMakeRotation(M_PI_2, 0, 0, 1);
   
    layer.transform = CATransform3DRotate(layer.transform, M_PI_2, 1, 1, 1);
        layer.transform = CATransform3DScale(layer.transform, 0.9, 0.9, 0.9);
       layer.transform = CATransform3DTranslate(layer.transform, 10, 10, 10);
      [CATransaction commit];
基础动画
 /*
    // 基础动画 :控制图层每次改变(大小,位置,旋转)多少
    // keyPath 决定了要动画具体做什么事情
    // transform.rotation.x  旋转
    // transform.scale   刻度(放大缩小)
    // transform.translate(position)  移动位置
    CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"transform.rotation"];
    animation.duration = 0.5;
   
    // 从什么状态开始
    animation.fromValue = @(0);
    // 每次改变多少
    animation.byValue = @(M_PI);
    // 转到什么状态结束
//    animation.toValue = @(20 * M_PI);
    // 动画重复多少次
//    animation.repeatCount = 100;
    animation.repeatDuration = MAXFLOAT;
    // 动画做完之后  倒退回来
    animation.autoreverses = YES;

    [layer addAnimation:animation forKey:@"basic"];
     */
    CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"transform.scale"];
    animation.duration = 0.2;
    animation.fromValue = @(0.8);
    animation.toValue = @(1.5);
    animation.repeatCount = MAXFLOAT;
    animation.autoreverses = YES;
    [layer addAnimation:animation forKey:@"scaleAnimation"];
关键帧动画
// 关键帧动画:可以控制图层在不同的时间点的不同的状态
    // position   指动画的中心点
    CAKeyframeAnimation *animation = [CAKeyframeAnimation animationWithKeyPath:@"position"];
    animation.duration = 0.5;
   
    // 不同的状态
    animation.values = @[[NSValue valueWithCGPoint:CGPointMake(30, 80)],[NSValue valueWithCGPoint:CGPointMake(280, 80)],[NSValue valueWithCGPoint:CGPointMake(150, 80)],[NSValue valueWithCGPoint:CGPointMake(200, 80)]];
   
    //     到达不同的位置的时间点  里面是比例
    animation.keyTimes = @[@(0),@(0.4),@(0.7),@(1)];
        animation.removedOnCompletion = NO;
    animation.fillMode = kCAFillModeForwards;
   
    [layer addAnimation:animation forKey:@"position"];

group动画
- (void)viewDidLoad {
    [super viewDidLoad];
   
    imageView = [[UIImageView alloc] initWithFrame:CGRectMake(130, 20, 60, 60)];
    imageView.image = [UIImage imageNamed:@"123"];
    imageView.layer.cornerRadius = 30;
    imageView.clipsToBounds = YES;
    [self.view addSubview:imageView];
   
}

- (void)viewWillAppear:(BOOL)animated
{
    // 旋转
    CABasicAnimation *basic = [CABasicAnimation animationWithKeyPath:@"transform.rotation"];
    basic.duration = 1;
    basic.fromValue = @(0);
    basic.toValue = @(4 * M_PI);
    basic.repeatDuration = 3;

   
    // 往下落
    CAKeyframeAnimation *moveKeyframe= [CAKeyframeAnimation animationWithKeyPath:@"position"];
    moveKeyframe.values = @[[NSValue valueWithCGPoint:CGPointMake(160, 50)],[NSValue valueWithCGPoint:CGPointMake(160, 550)],[NSValue valueWithCGPoint:CGPointMake(160, 200)],[NSValue valueWithCGPoint:CGPointMake(160, 550)],[NSValue valueWithCGPoint:CGPointMake(160, 350)],[NSValue valueWithCGPoint:CGPointMake(160, 550)]];
    moveKeyframe.keyTimes = @[@(0),@(0.2),@(0.4),@(0.6),@(0.8),@(1)];
    moveKeyframe.timingFunctions = @[[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseIn],[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseOut],[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseIn],[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseOut],[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseIn]];
   
   
    // 放大
    CAKeyframeAnimation *scaleKeyframe = [CAKeyframeAnimation animationWithKeyPath:@"transform.scale"];
    scaleKeyframe.values = @[@(1),@(1.5),@(1.3),@(1.5),@(1.4),@(1.5)];
    scaleKeyframe.keyTimes = @[@(0),@(0.2),@(0.4),@(0.6),@(0.8),@(1)];
   
    // 动画组
    CAAnimationGroup *group = [CAAnimationGroup animation];
    group.animations = @[basic,moveKeyframe,scaleKeyframe];
    group.duration = 3;
    group.removedOnCompletion = NO;
    group.fillMode = kCAFillModeForwards;
    [imageView.layer addAnimation:group forKey:@"group"];
    

原文地址:https://www.cnblogs.com/LGX3399577/p/LGX.html