iOS动画原理

一、UIView自带动画(UIKit框架中)

        只有当UIView的以下属性改变时才能产生动画效果,且这些动画效果都是平面性的(二维的),基于手机屏幕的平面,主要有“平移(位置改变,沿x轴、Y轴或同时改变)”、“缩放(view大小改变,宽高)”、“旋转(只有沿Z轴,即垂直于屏幕的轴,旋转平行于屏幕)”、“背景色的改变”、“透明度”:

        (1)Translation(平移)创建一个平移换,起始位置 x 会加上tx , y 会加上 ty:
                CGAffineTransform CGAffineTransformMakeTranslation(CGFloat tx,CGFloat ty)
        (2)Scale(缩放) 宽度就会变为  width*sx  ,对应高度变为  hight * sy:
                CGAffineTransform CGAffineTransformMakeScale(CGFloat sx, CGFloat sy)
         (3)Rotation(旋转)将一个图片视图旋转了多少度,参数是弧度,先把度转化为弧度:
                CGAffineTransform CGAffineTransformMakeRotation(CGFloat angle)  //90.0*(M_PI/180.0)  顺时针旋转90度,-90.0*(M_PI/180.0) 逆时针旋转90度,view的旋转方向仅以整个圆周最小的弧度,即270不会顺时针转3/4圈,而是逆时针转1/4圈,以180为界,大于等于180了就是逆时针了
          (4)为一个变换再加上平移换:
                CGAffineTransform CGAffineTransformTranslate(CGAffineTransform t,CGFloat tx, CGFloat ty)
           (5)为一个Transformation再加上缩放
                CGAffineTransform CGAffineTransformScale(CGAffineTransform t,CGFloat sx, CGFloat sy)
            (6) 为一个Transformation再加上旋转
                 CGAffineTransform CGAffineTransformRotate(CGAffineTransform t,CGFloat angle)
            (7) 判断一个变换是不是原生变换,即没有什么变换:
                bool CGAffineTransformIsIdentity(CGAffineTransform t)
             (8)创建一个变换的反向效果:
                CGAffineTransform CGAffineTransformInvert(CGAffineTransform t)
              (9)合并两个变换:
                CGAffineTransform CGAffineTransformConcat(CGAffineTransform t1,CGAffineTransform t2)
              (10)判断两个变换是否一样:
                 bool CGAffineTransformEqualToTransform(CGAffineTransform t1,CGAffineTransform t2)

   例子:

[UIView beginAnimations:@"View Flip" context:nil];
[UIView setAnimationDuration:2.25];                      //动画持续时间,秒
[UIView setAnimationCurve:UIViewAnimationCurveLinear];//动画执行速度(UIViewAnimationCurveEaseInOut--动画开始和结束慢,中间快  UIViewAnimationCurveEaseIn--开始慢,后面快 UIViewAnimationCurveEaseOut--前面快,结束慢   UIViewAnimationCurveLinear--匀速)
[UIView setAnimationDelegate:self];//一定要设置动画的委托
................{改变View属性的代码块}...................
[UIView commitAnimations];



二、使用核心动画(Core Animation)[QuartzCore.framework中]
           (1).UIView与CALayer的关系:http://www.cnblogs.com/mjios/archive/2013/04/14/3019728.html
                                                         http://www.cnblogs.com/lovecode/articles/2249548.html
                 实质上UIView中元素的展示与渲染都是靠CALayer来实现,每个UIView都包含有一个layer属性,view与layer操作上也是一样,既能addSubLayers(addSubView)也能获取父视图(父layer),创建layer对象时也需指定大小(frame)、内容(content)、背景色等属性,唯一不同的时UIView还继承自UIResponder,便能响应用户事件,而CALayer直接继承自NSObject,不能响应
                 第一点中的直接操作UIView的某些属性便能产生动画,其实质就是操作改UIView对象中的Layer对象的属性
           (2). QuartzCore框架中动画产生的原理
                  该框架中有三种类型的动画:
                     CABasicAnimation
                     CAKeyframeAnimation
                     CATransition
                  只要将创建好这三种动画对象add到layer上便能产生动画效果,不再需要使用第一点中UIView得代码块提交了,他们的继承关系如下:
                    IOS <wbr>动画总结
                 (3).CABasicAnimation和CAKeyframeAnimation是对图层中的不同属性进行动画的,即第一点所说的支持动画的那些属性

                 (4).使用:CATransition

                     - (void)changeUIView2{  
                              CATransition *transition [CATransition animation];  
                              transition.duration 2.0f; 
                             
 transition.type kCATransitionPush; 
                             
 transition.subtype kCATransitionFromTop; 
                             
 [self.view exchangeSubviewAtIndex:1 withSubviewAtIndex:0];
                              
 [self.view.layer addAnimation:transition forKey:@"animation"];
                     }
    transition.type 的类型可以有

    淡化、推挤、揭开、覆盖

    NSString * const kCATransitionFade;

    NSString * const kCATransitionMoveIn;

    NSString * const kCATransitionPush;

    NSString * const kCATransitionReveal;


    transition.subtype 
    也有四种

    NSString * const kCATransitionFromRight;

    NSString * const kCATransitionFromLeft;

    NSString * const kCATransitionFromTop;

    NSString * const kCATransitionFromBottom;


    • 0
      点赞
    • 0
      收藏
      觉得还不错? 一键收藏
    • 0
      评论

    “相关推荐”对你有帮助么?

    • 非常没帮助
    • 没帮助
    • 一般
    • 有帮助
    • 非常有帮助
    提交
    评论
    添加红包

    请填写红包祝福语或标题

    红包个数最小为10个

    红包金额最低5元

    当前余额3.43前往充值 >
    需支付:10.00
    成就一亿技术人!
    领取后你会自动成为博主和红包主的粉丝 规则
    hope_wisdom
    发出的红包
    实付
    使用余额支付
    点击重新获取
    扫码支付
    钱包余额 0

    抵扣说明:

    1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
    2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

    余额充值