过渡动画

1、CAAnimation的子类,用于做转场动画,能够为层提供移出屏幕和移入屏幕的动画效果

type:动画过渡类型

subtype:动画过渡方向

startProgress:动画起点(在整体动画的百分比)

endProgress:动画终点(在整体动画的百分比)

 CATransition *ca=[CATransition animation];

    //设置过度效果

    ca.type=@"cube";

    //设置动画的过度方向(向左)

    ca.subtype=kCATransitionFromLeft;

    //设置动画的时间

    ca.duration=1.0;

    //添加动画

  self.redView.backgroundColor = [UIColor blueColor];

    [self.redView.layer addAnimation:ca forKey:nil];

2、实例

 //1 准备动画

    [UIView beginAnimations:@"过度动画" context:NULL];

    [UIView setAnimationDuration:5];

    [UIView setAnimationRepeatCount:50];

    //2 设置过度样式

    //参数1: 过度样式, 参数2: 指定那个View做动画, 参数3: 是否设置缓存

    [UIView setAnimationTransition:UIViewAnimationTransitionFlipFromLeft forView:self.redView cache:YES];

    self.redView.backgroundColor = [UIColor colorWithRed:arc4random() % 256 / 255.0 green:arc4random() % 256 / 255.0 blue:arc4random() % 256 / 255.0 alpha:0.5];

    //3 提交并执行动画

    [UIView commitAnimations];

 

//UIView属性动画

- (IBAction)pressPropertyAnimation:(id)sender {

    //1 准备动画

    //参数1: 动画的作用, 用来区分多个动画, 参数二: 传递参数用 nil:OC中使用 NULL:C语言使用

    [UIView beginAnimations:@"改变大小" context:NULL];

    //在准备动画的时候可以设置动画的属性

    [UIView setAnimationDuration:2];//设置动画的持续时间

    [UIView setAnimationDelegate:self];

    [UIView setAnimationWillStartSelector:@selector(startAnimation)];

    //    [UIView setAnimationDelay:1];//动画延迟执行时间

    [UIView setAnimationCurve:UIViewAnimationCurveEaseInOut];//动画的曲线

    [UIView setAnimationRepeatCount:20];//动画的重复次数

    [UIView setAnimationRepeatAutoreverses:YES];//动画往返执行, 必须设置动画的重复次数

    //2 修改view的属性, 可以同时修改多个属性 注意:不是所有的属性都可以修改的(只有frame, center, bounds, backgroundColor, alpha, transform 可以修改)

    self.redView.frame = CGRectMake(110, 100, 100, 100);

    //    self.redView.backgroundColor = [UIColor brownColor];

    self.redView.backgroundColor = [UIColor colorWithRed:arc4random() % 256 / 255.0 green:arc4random() % 256 / 255.0 blue:arc4random() % 256 / 255.0 alpha:0.5];

    //3 提交并执行动画

    [UIView commitAnimations];

}

 

组动画

CAAnimation的子类,可以保存一组动画对象,将CAAnimationGroup对象加入层后,组中所有动画对象可以同时并发运行

animations:用来保存一组动画对象的NSArray

默认情况下,一组动画对象是同时运行的,也可以通过设置动画对象的beginTime属性来更改动画的开始时间

 

// 平移动画

    CABasicAnimation *a1 = [CABasicAnimation animation];

    a1.keyPath = @"transform.translation.y";

    a1.toValue = @(100);

    a1.duration = 1.0;

    a1.beginTime = 0;

    a1.fillMode = kCAFillModeForwards;

 

    // 缩放动画

    CABasicAnimation *a2 = [CABasicAnimation animation];

    a2.keyPath = @"transform.scale";

    a2.toValue = @(0.5);

    a2.duration = 1.0;

    a2.beginTime = 1.0;

    a2.fillMode = kCAFillModeForwards;

 

    // 旋转动画

    CABasicAnimation *a3 = [CABasicAnimation animation];

    a3.keyPath = @"transform.rotation";

    a3.toValue = @(M_PI_4);

    a3.duration = 1.0;

    a3.beginTime = 2.0;

    a3.fillMode = kCAFillModeForwards;

  

    // 组动画

    CAAnimationGroup *groupAnima = [CAAnimationGroup animation];

    groupAnima.animations = @[a1, a2, a3];

    

    //设置组动画的时间

    groupAnima.duration = 3;

    groupAnima.fillMode = kCAFillModeForwards;

    groupAnima.removedOnCompletion = NO;

    

    [self.redView.layer addAnimation:groupAnima forKey:nil];

 

//    CAAnimationGroup 组动画

- (IBAction)pressAnimationGroup:(id)sender {

    

    //1 创建并指定要修改的属性

    //    KeyPath:CAlayer的属性名, 不是所有的属性都可以, 只有在头文件中出现animatable的属性才可以, 可以修改属性的属性, 例如:bounds.size

    //    CALayer

    CABasicAnimation *basic = [CABasicAnimation animationWithKeyPath:@"bounds"];

    [basic setDuration:2];

    //2 修改属性值

    basic.fromValue = [NSValue valueWithCGRect:CGRectMake(0, 0, self.redView.bounds.size.width, self.redView.bounds.size.height)];

    basic.toValue = [NSValue valueWithCGRect:CGRectMake(0, 0, 300, 300)];

    

    CAKeyframeAnimation *keyFrame = [CAKeyframeAnimation animationWithKeyPath:@"backgroundColor"];

    [keyFrame setDuration:5];

    keyFrame.values = @[(id)[UIColor redColor].CGColor, (id)[UIColor orangeColor].CGColor, (id)[UIColor yellowColor].CGColor, (id)[UIColor greenColor].CGColor, (id)[UIColor blueColor].CGColor];

    //keyTimes中的第一个值是0, 不能修改

    keyFrame.keyTimes = @[@(0.3), @(0.5), @(0.6), @(0.7), @(0.9)];

 

    

// 创建

    //当group动画的时长 > 组中所有动画的最长时长, 动画的时长以组中最长的时长为准

    //当group动画的时长 < 组中所有动画的最长时长, 动画的时长以group的时长为准

    //最合适: group的时长 = 组中所有动画的最长时长

    CAAnimationGroup *group = [CAAnimationGroup animation];

    [group setDuration:10];

    //设置组动画

    group.animations = @[basic, keyFrame];

    //添加动画

    [self.redView.layer addAnimation:group forKey:nil];

}

 

//Block动画

- (IBAction)pressBlockAnimation:(id)sender {

    //只有一行代码 Block动画实质是对UIView动画的封装

    //参数1:动画时长 参数2:Block: 设置要修改的View属性

    /*

     [UIView animateWithDuration:2 animations:^{

     self.redView.backgroundColor = [UIColor orangeColor];

     }];

     */

    //第二种Block

    /*

     //参数1:动画时长 参数2:Block: 设置要修改的View属性 参数3: 动画完成时调用

     [UIView animateWithDuration:2 animations:^{

     self.redView.backgroundColor = [UIColor orangeColor];

     } completion:^(BOOL finished) {

     //finished判断动画是否完成

     if (finished) {

     NSLog(@"finished");

     }

     }];

     */

    //第三种Block

    /*

     [UIView animateWithDuration:2 delay:1 options:UIViewAnimationOptionCurveEaseInOut animations:^{

     //        设置要修改的View属性

     self.redView.backgroundColor = [UIColor orangeColor];

     } completion:^(BOOL finished) {

     //finished判断动画是否完成

     if (finished) {

     NSLog(@"finished");

     }

     }];

     */

    //对过度动画的封装

    //参数1: 改变的View 参数2:动画时长 参数3:动画类型 参数4 Block: 设置要修改的View属性 参数5:完成后的操作

    [UIView transitionWithView:self.redView duration:2 options:UIViewAnimationOptionTransitionFlipFromLeft animations:^{

        self.redView.backgroundColor = [UIColor orangeColor];

    } completion:^(BOOL finished) {

        //finished判断动画是否完成

        if (finished) {

            NSLog(@"finished");

        }

    }];

 

   //UIView和CALayer的关系

    //UIView负责交互, frame以及显示CALayer

    //CALayer负责渲染, 并且它是UIView的一个readonly属性

    /*

     self.redView.layer.cornerRadius = 100;//设置圆角, 参数是内切圆的半径, 若想画一个圆, 前提是view必须是正方形, 参数应该是view边长的一半

     self.redView.layer.borderWidth = 1;//设置描边的宽度

     self.redView.layer.borderColor = [UIColor orangeColor].CGColor;//设置描边的颜色(UIView上的颜色使用的是UIColor, CALayer上使用的颜色是CGColor)

     self.redView.layer.shadowOffset = CGSizeMake(50, 100);//设置阴影的偏移量 width影响水平偏移(正右负左), height影响垂直偏移(正下负上)

     self.redView.layer.shadowColor = [UIColor grayColor].CGColor;//阴影的偏移的颜色

     self.redView.layer.shadowOpacity = 1;//阴影的不透明度, 取值范围(0 ~ 1), 默认是0, 就是透明的

     */

    //    CAAnimation抽象类, 使用必须要使用其具体的子类

    //    CAPropertyAnimation抽象子类, 需要子类化

    //    CABasicAnimation

    //    CAKeyframeAnimation

 

}