iOS - Animation 八种方法

一.//UIView动画

//能够做动画的属性, feame, center, bounds, alpha, transfom, backgroundcolor

 //iOS4.0 之前如果想做动画, 必须放在开始可提交之前才有效

    //对属性更改值是有效值, 最终会对视图作出修改

    //开始动画

    [UIView beginAnimations:nil context:nil];

    

    //1.设置动画持续的时间 --- 单位

    [UIView setAnimationDuration:2];

    //2.设置动画代理(但是不需要服从代理)

    [UIView setAnimationDelegate:self];

    //3.但是动画结束后执行的方法

    [UIView setAnimationDidStopSelector:@selector(handleDidStop)];

    //4.设置动画延迟的时间 --- 单位

//    [UIView setAnimationDelay:2];

    //5.设置动画从当前状态发生变化

    [UIView setAnimationBeginsFromCurrentState:YES];

    //6.设置动画是否反转

    [UIView setAnimationRepeatAutoreverses:YES];

    //7.设置动画重复次数

    [UIView setAnimationRepeatCount:10];

    //8.设置动画变化的曲线

    [UIView setAnimationCurve:UIViewAnimationCurveEaseInOut];

    //center -- 视图位置

    CGPoint center = self.redView.center;

    center.y += 10;

    self.redView.center = center;

    self.redView.alpha = 0.1;  //alpha -- 透明度

    //transition 旋转--缩放

    self.redView.transform = CGAffineTransformRotate(self.redView.transform, 0.5);

    self.redView.transform = CGAffineTransformScale(self.redView.transform, 0.5, 0.5);

   [UIView commitAnimations];   //提交动画

二.iOS4.0 之后 基于Block的动画 -- (Leo推荐)

    //1.最简单的black 方法

    [UIView animateWithDuration:4 animations:^{

        //对属性更改, 做动画操作

        //center -- 视图位置

        CGPoint center = self.redView.center;

        center.y += 10;

        self.redView.center = center;

        //alpha -- 透明度

        self.redView.alpha = 0.1;

        

        //transition 旋转--缩放

        self.redView.transform = CGAffineTransformRotate(self.redView.transform, 0.5);

        self.redView.transform = CGAffineTransformScale(self.redView.transform, 0.5, 0.5);  

    }];

    //2.block 形式升级版 -- 可以检测动画结束时间

    [UIView animateWithDuration:4 animations:^{

        //对属性更改, 做动画操作

        //center -- 视图位置

        CGPoint center = self.redView.center;

        center.y += 10;

        self.redView.center = center;

        //alpha -- 透明度

        self.redView.alpha = 0.1;

        //transition 旋转--缩放

        self.redView.transform = CGAffineTransformRotate(self.redView.transform, 0.5);

        self.redView.transform = CGAffineTransformScale(self.redView.transform, 0.5, 0.5);

    } completion:^(BOOL finished) {

  ...

    }];

    //3.block 形式加强版 -- 不光可以捕获结束时间, 而且可以配置多个参数

    [UIView animateWithDuration:4 delay:1 options:UIViewAnimationOptionAutoreverse animations:^{

        //对属性更改, 做动画操作

        //center -- 视图位置

        CGPoint center = self.redView.center;

        center.y += 10;

        self.redView.center = center;

        //alpha -- 透明度

        self.redView.alpha = 0.1;

        

        //transition 旋转--缩放

        self.redView.transform = CGAffineTransformRotate(self.redView.transform, 0.5);

        self.redView.transform = CGAffineTransformScale(self.redView.transform, 0.5, 0.5);

    } completion:^(BOOL finished) {

        ...

    }];

    //4.弹簧效果

    //1.持续时间; 2.延迟时间; 3.弹簧强度; 4.开始变化速度; 5.动画效果参数; 6.动画代码; 7.结束动画

    [UIView animateWithDuration:4 delay:0 usingSpringWithDamping:0.01 initialSpringVelocity:10 options:UIViewAnimationOptionCurveEaseInOut animations:^{

        //对属性更改, 做动画操作

        //transition 旋转--缩放

        self.thLabel.transform = CGAffineTransformScale(self.redView.transform, 1.2, 1.2);

    } completion:nil];

三.过度动画 - 界面间的过度

    [UIView transitionWithView:self.redView duration:4 options:UIViewAnimationOptionCurveEaseInOut animations:^{

        //旋转

        self.redView.transform = CGAffineTransformRotate(self.redView.transform, M_PI_2); // 旋转45°, M_PI_2 90°, M_PI_1 180°

    } completion:nil];

    //从一个视图切换到另一个视图

    [UIView transitionFromView:self.redView toView:self.yellowView duration:1 options:UIViewAnimationOptionTransitionCurlDown completion:^(BOOL finished) {

/*  self.yellowView = [[UIView alloc]initWithFrame:self.redView.frame];  */

        //改变指针的指向

        UIView *tempView = [self.redView retain];

        self.redView = self.yellowView;

        self.yellowView = tempView;

        [tempView release];   

    }];

四.UIView CALayer 的区别

//UIView 其实是CALayer 层的简单封装, 真正绘制显示内容的还是CAlayer 每一个视图都有一个layer 属性可以访问到自己的layer , UIView封装了常用的属性, 不常用的属性还是要设置CALayer

 //1.设置视图边框的宽度

    self.redView.layer.borderWidth = 2;

    //设置视图边框的颜色

    self.redView.layer.borderColor = [UIColor whiteColor].CGColor;

    //3.设置视图的圆角

    self.redView.layer.cornerRadius = 20;

    //4.多余部分剪裁掉

    self.redView.layer.masksToBounds = YES;

    //5.设置视图的锚点 -- 旋转的基准点 (不设置默认为中心)

    self.redView.layer.anchorPoint = CGPointMake(1, 1);

//基准点

    self.redView.layer.position = CGPointMake(240, 360);

    self.redView.transform = CGAffineTransformRotate(self.redView.transform, M_PI_4);

五.CA属性动画 -- (基本属性动画)

(1)

//CA动画修改属性值最终不会作用到视图

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

    //开始变化值

    basic.fromValue = @(1.0);

    //结束变化值

    basic.toValue = @(0.1);

    basic.duration = 2;

    //添加到视图的layer

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

(2)

    CABasicAnimation *basic = [CABasicAnimation animationWithKeyPath:@"position.x"];

    //变化的开始值

    basic.fromValue = @(self.cloud.center.x);

    //变化的结束值

    basic.toValue = @([UIScreen mainScreen].bounds.size.width + CGRectGetWidth(self.cloud.frame) / 2);

    basic.duration = 5;

    basic.repeatCount = 100;

    //添加到视图的 layer

    [self.cloud.layer addAnimation:basic forKey:nil];

六.CA属性动画 -- 关键帧动画

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

    CGPoint point1 = self.cloud.center;

    CGPoint point2 = CGPointMake(160, 45);

    CGPoint point3 = CGPointMake([UIScreen mainScreen].bounds.size.width - 45, 425);

    

    NSValue *value1 = [NSValue valueWithCGPoint:point1];

    NSValue *value2 = [NSValue valueWithCGPoint:point2];

    NSValue *value3 = [NSValue valueWithCGPoint:point3];

    

    keyFrame.values = @[value1, value2, value3, value1];

    keyFrame.duration = 10;

    keyFrame.repeatCount = 100;

    

    [self.cloud.layer addAnimation:keyFrame forKey:nil];

七.CA过度动画

    CATransition *transtion = [CATransition animation];

    //配置过度动画类型

    transtion.type = @"cube";

    //配置过度动画方向

    transtion.subtype = kCATransitionFromLeft;

    //添加到视图layer

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

    

    /* 过渡效果 (苹果私有)

     fade     //交叉淡化过渡(不支持过渡方向) kCATransitionFade

     push     //新视图把旧视图推出去  kCATransitionPush

     moveIn   //新视图移到旧视图上面   kCATransitionMoveIn

     reveal   //将旧视图移开,显示下面的新视图  kCATransitionReveal

     cube     //立方体翻滚效果

     oglFlip  //上下左右翻转效果

     suckEffect   //收缩效果,如一块布被抽走(不支持过渡方向)

     rippleEffect //滴水效果(不支持过渡方向)

     pageCurl     //向上翻页效果

     pageUnCurl   //向下翻页效果

     cameraIrisHollowOpen  //相机镜头打开效果(不支持过渡方向)

     cameraIrisHollowClose //相机镜头关上效果(不支持过渡方向)

     */

八.CA分组动画

    //1.关键帧动画 -- 沿圆形轨迹移动

    CAKeyframeAnimation *keyframe = [CAKeyframeAnimation animationWithKeyPath:@"position"];

    

    //绘制半圆路径

    CGFloat y = [UIScreen mainScreen].bounds.size.width - 100;

    UIBezierPath *path = [UIBezierPath bezierPathWithArcCenter:CGPointMake(0, y) radius:y startAngle:-M_PI_2 endAngle:M_PI_2 clockwise:YES];

    //关键帧动画给上圆形轨迹

    keyframe.path = path.CGPath; // UIBezierPath 作为移动轨迹

    keyframe.duration = 5;

    keyframe.repeatCount = 100;

    

    //2.关键帧动画 -- 气球的放大缩小

    CAKeyframeAnimation *keyFrame1 = [CAKeyframeAnimation animationWithKeyPath:@"transform.scale"];

    keyFrame1.values = @[@(1.0), @(1.2), @(1.4), @(1.6), @(1.8), @(2.0), @(1.8), @(1.6), @(1.4), @(1.2), @(1.0)];

    keyFrame1.duration = 5;

    

    //创建分组动画

    CAAnimationGroup *group = [CAAnimationGroup animation];

    group.animations = @[keyframe, keyFrame1];

    group.duration = 5;

    group.repeatCount = 1000;

    

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

 

 

 

posted @ 2015-09-17 19:32  kevin丶涛  阅读(665)  评论(0编辑  收藏  举报