您的当前位置:首页动画篇---iOS笔记摘录

动画篇---iOS笔记摘录

2024-12-14 来源:哗拓教育
目录
    1. UIView动画
        1.1 animateWithDuration
        1.2 beginAnimations
        1.3 形变CGAffineTransform
    2. CoreAnimation核心动画
    3. 物理动画
    4. 粒子动画
    5. UIViewPropertyAnimator属性动画器(iOS10)

简介

iOS系统动画分为:
    UIView动画
        基本动画、转场动画、关键帧动画、弹性动画
    CoreAnimation动画
        基本动画、转场动画、关键帧动画、弹性动画、组动画

可嵌套
1. UIView动画

1.1 animateWithDuration

基本动画
    [UIView animateWithDuration:2.0 animations:^{
    }];
    [UIView animateWithDuration:2.0 animations:^{
    } completion:^(BOOL finished) {
    }];
    [UIView animateWithDuration:2.0 delay:1.0 options:UIViewAnimationOptionCurveEaseOut animations:^{
    } completion:^(BOOL finished) {
    }];
弹簧动画
    [UIView animateWithDuration:2.0 delay:1.0 usingSpringWithDamping:0.8 initialSpringVelocity:0.3 options:UIViewAnimationOptionCurveEaseOut animations:^{
    } completion:^(BOOL finished) {
    }];
转场动画
    视图转换动画,可以用来切换2端:修改rootVC
    [UIView transitionFromView:[UIView new] toView:[UIView new] duration:2.0 options:UIViewAnimationOptionCurveEaseOut completion:^(BOOL finished) {
    }];
过渡动画
    [UIView transitionWithView:[UIView new] duration:2.0 options:UIViewAnimationOptionCurveEaseOut animations:^{
    } completion:^(BOOL finished) {
    }];
关键帧动画(分段动画)
    [UIView animateKeyframesWithDuration:2.0 delay:1.0 options:UIViewKeyframeAnimationOptionCalculationModeCubic animations:^{
    } completion:^(BOOL finished) {
        // 0时间点 执行1/3时长
        [UIView addKeyframeWithRelativeStartTime:0 relativeDuration:1/3 animations:^{
        }];
        // 1/3时间点 执行2/3时长
        [UIView addKeyframeWithRelativeStartTime:1/3 relativeDuration:2/3 animations:^{
        }];
    }];
控件消失动画
        [UIView performWithoutAnimation:^{
        }];
        [UIView performSystemAnimation:UISystemAnimationDelete onViews:@[[UIView new]] options:UIViewAnimationOptionCurveEaseOut animations:^{
        } completion:^(BOOL finished) {
        }];

    /* 
    参数说明:
     duration:动画持续时间(以s为单位)
     animations:动画操作
        frame、bounds、center
        alpha、backgroundColor
        transform
        约束(无效,修改后需要调用[self layoutIfNeeded])
     delay:动画延迟时间
     damping:阻力(0~1越小越弹) 
     velocity:初始速度(0~1)
     completion:完成后的动作 
     options:动画类型
         UIViewAnimationOptionLayoutSubviews                子控件与父控件一起动画
         UIViewAnimationOptionAllowUserInteraction          动画时允许交互
         UIViewAnimationOptionBeginFromCurrentState         从当前状态开始动画
         UIViewAnimationOptionRepeat                        重复动画(completion无效)
         UIViewAnimationOptionAutoreverse                   动画反向(前提:设置无限循环)
         UIViewAnimationOptionOverrideInheritedDuration     忽略外层动画的执行时间
         UIViewAnimationOptionOverrideInheritedCurve        忽略外层动画的时间变换曲线
         UIViewAnimationOptionAllowAnimatedContent          通过改变属性和重绘实现动画
         UIViewAnimationOptionShowHideTransitionViews       用隐现的方式实现动画
         UIViewAnimationOptionOverrideInheritedOptions      忽略嵌套继承的属性
         //
         UIViewAnimationOptionCurveEaseInOut                时间曲线函数——由慢到快到慢 默认
         UIViewAnimationOptionCurveEaseIn                   时间曲线函数——由慢到快
         UIViewAnimationOptionCurveEaseOut                  时间曲线函数——由快到慢
         UIViewAnimationOptionCurveLinear                   时间曲线函数——匀速
         //         
         UIViewAnimationOptionTransitionNone                无转场动画
         UIViewAnimationOptionTransitionFlipFromLeft        左到右
         UIViewAnimationOptionTransitionFlipFromRight       右到左
         UIViewAnimationOptionTransitionCurlUp              翻页上
         UIViewAnimationOptionTransitionCurlDown            翻页下
         UIViewAnimationOptionTransitionCrossDissolve       交叉消失
         UIViewAnimationOptionTransitionFlipFromTop         上到下
         UIViewAnimationOptionTransitionFlipFromBottom      下到上
    options:关键帧动画类型 
        //
        子控件与父控件一起动画
        UIViewKeyframeAnimationOptionLayoutSubviews            = UIViewAnimationOptionLayoutSubviews,
        动画时允许交互
        UIViewKeyframeAnimationOptionAllowUserInteraction      = UIViewAnimationOptionAllowUserInteraction,
        从当前状态开始动画(而不是初始值)
        UIViewKeyframeAnimationOptionBeginFromCurrentState     = UIViewAnimationOptionBeginFromCurrentState,
        重复动画(导致completion不会执行)
        UIViewKeyframeAnimationOptionRepeat                    = UIViewAnimationOptionRepeat,
        动画后后返回(前提设置无限循环)
        UIViewKeyframeAnimationOptionAutoreverse               = UIViewAnimationOptionAutoreverse,
        忽略外层动画的执行时间
        UIViewKeyframeAnimationOptionOverrideInheritedDuration = UIViewAnimationOptionOverrideInheritedDuration,
        忽略外层动画的时间变换曲线
        UIViewKeyframeAnimationOptionOverrideInheritedOptions  = UIViewAnimationOptionOverrideInheritedOptions,
        // 
        UIViewKeyframeAnimationOptionCalculationModeLinear     连续性动画(连续的)
        UIViewKeyframeAnimationOptionCalculationModeDiscrete   离散性动画(不连续的---蹦来蹦去)
        UIViewKeyframeAnimationOptionCalculationModePaced      均匀(自动计算---忽略起始和结束时间,只需设置时间段)
        UIViewKeyframeAnimationOptionCalculationModeCubic      平滑
        UIViewKeyframeAnimationOptionCalculationModeCubicPaced 平滑均匀
     */

1.2 beginAnimations

        // 1.start
        [UIView beginAnimations:nil context:nil];
        // 2.set
        [UIView setAnimationDuration:2.0];                                  // 动画持续时间
        [UIView setAnimationDelay:1.0];                                     // 动画延迟时间
        [UIView setAnimationRepeatCount:10];                                // 动画执行次数
        [UIView setAnimationCurve:UIViewAnimationCurveEaseInOut];           // 动画类型
        [UIView setAnimationDelegate:self];                                 // dele 
        [UIView setAnimationsEnabled:true];                                 // enable ?
        [UIView setAnimationRepeatAutoreverses:true];                       // 动画完成后是否反向返回
        [UIView setAnimationBeginsFromCurrentState:true];                   // 是否从当前状态开始动画
        [UIView setAnimationStartDate:[NSDate new]];                        // 动画开始时间
        [UIView setAnimationDidStopSelector:@selector(didStopAnima)];       // 动画结束后的方法
        [UIView setAnimationWillStartSelector:@selector(willStartAnima)];   // 动画开始前的方法
        [UIView setAnimationBeginsFromCurrentState:true];                   // 是否从当前状态开始动画(而不是初始状态)
        // 3.动画操作(同上)
        // 
        [UIView commitAnimations];



        // 页面翻转
        [UIView setAnimationTransition:UIViewAnimationTransitionCurlUp forView:self.view cache:true];
        [self.view exchangeSubviewAtIndex:0 withSubviewAtIndex:1];


CAAnimationDelegate
- (void)animationDidStart:(CAAnimation *)anim;
- (void)animationDidStop:(CAAnimation *)anim finished:(BOOL)flag;

1.3 形变CGAffineTransform

平移/缩放/旋转
    transform可修改默认大小不能改变的控件:UISwitch
    改变锚点可使形变的参照点改变

UIView *view=[UIView new];

//---------绝对型变---------
// 绝对平移(每次执行时 相对原状态 做改变)
[view setTransform:CGAffineTransformMakeTranslation(0, 10)];       
// 绝对缩放(相对原状态)    
[view setTransform:CGAffineTransformMakeScale(1.1, 1.1)];              
// 绝对旋转(相对原状态)
[view setTransform:CGAffineTransformMakeRotation(M_PI_2)];   
          
//---------相对型变---------
// 相对平移(每次执行时 相对于上一次状态)
[view setTransform:CGAffineTransformTranslate(view.transform, 0, 10)];  
// 相对缩放
[view setTransform:CGAffineTransformScale(view.transform, 1.1, 1.1)];  
// 相对旋转
[view setTransform:CGAffineTransformRotate(view.transform, M_PI)];      
// 还原形变
[view setTransform:CGAffineTransformIdentity];                          
// 联合
[view setTransform:CGAffineTransformConcat(transform1, transform2)];    
// 是否是原始状态
BOOL IsIdentity=CGAffineTransformIsIdentity(transform);                   
// 是否相等
BOOL isEqual=CGAffineTransformEqualToTransform(transform1, transform2);              
// transform1的反向操作
[[UIView new]setTransform:CGAffineTransformInvert(transform1)];

// ?
CGPointApplyAffineTransform(point,transform)
CGSizeApplyAffineTransform(size,transform)
CGRectApplyAffineTransform(rect,transform)

3D

    // 2D--->3D
    CATransform3D transform3D=CATransform3DMakeAffineTransform(CGAffineTransformMakeTranslation(0, 0));
    // 3D--->2D
    CGAffineTransform transform2D=CATransform3DGetAffineTransform(transform3D);
    
    // 相对 缩放,旋转,移动
    transform3D=CATransform3DScale(transform3D, 1, 1, 1);
    transform3D=CATransform3DRotate(transform3D, 180, 1, 1, 1);
    transform3D=CATransform3DTranslate(transform3D, 1, 1, 1);
    // 绝对 缩放,旋转,移动
    transform3D=CATransform3DMakeScale(1, 1, 1);
    transform3D=CATransform3DMakeRotation(180, 1, 1, 1);
    transform3D=CATransform3DMakeTranslation(1, 1, 1);
    // 组
    transform3D=CATransform3DConcat(transform3D, transform3D);
    // 还原
    transform3D=CATransform3DIdentity;
    // 3D形变
    [newView setTransform:CATransform3DGetAffineTransform(transform3D)];

原理

[transform矩阵变换知识]
1. CGAffineTransform
public struct CGAffineTransform {
    public var a: CGFloat
    public var b: CGFloat
    public var c: CGFloat
    public var d: CGFloat
    public var tx: CGFloat
    public var ty: CGFloat
    public init()
    public init(a: CGFloat, b: CGFloat, c: CGFloat, d: CGFloat, tx: CGFloat, ty: CGFloat)
}
2.
运算原理:(0,0,1 固定,是能运算)
                            |a    b    0|
       [X,Y,  1]      |c    d    0|     =     [aX + cY + tx   bX + dY + ty  1] ;
                            |tx    ty  1|
    第一种:设a=d=1, b=c=0.  
        [aX + cY + tx   bX + dY + ty  1] = [X  + tx  Y + ty  1];
        坐标是按照向量(tx,ty)进行平移  :   函数CGAffineTransform CGAffineMakeTranslation(CGFloat tx,CGFloat ty)的计算原理。
    第二种:设b=c=tx=ty=0.  
        [aX + cY + tx   bX + dY + ty  1] = [aX    dY   1];
        坐标X按照a进行缩放,Y按照d进行缩放,a,d就是X,Y的比例系数  :   函数CGAffineTransform CGAffineTransformMakeScale(CGFloat sx, CGFloat sy)的计算原理。a对应于sx,d对应于sy。
    第三种:设tx=ty=0,a=cosɵ,b=sinɵ,c=-sinɵ,d=cosɵ。
        [aX + cY + tx   bX + dY + ty  1] = [Xcosɵ - Ysinɵ    Xsinɵ + Ycosɵ  1] ;
        ɵ就是旋转的角度,逆时针为正,顺时针为负  :   函数CGAffineTransform CGAffineTransformMakeRotation(CGFloat angle)的计算原理。angle即ɵ的弧度表示。
    
3D
                                  |m11    m21    m31  m41|
       [X,Y,Z,  1]       |m12    m22    m32  m42|   =    |x’ Y’ Z’ 1|
                                 |m13    m23    m33  m43|
                 |m14    m24    m34  m44|

m34通过比例用来做透视(形成近小远大)默认值:0    -1/500
2. CoreAnimation复杂动画
CoreAnimation复杂动画(操作Layer层)
    [Core Animation框架层]

    相比UIView Animation:
        轻量级的数据结构,可以同时让上百个图层产生动画效果
        拥有独立的线程用于执行我们的动画接口
        完成动画配置后,核心动画会代替我们完全控制完成对应的动画帧
        提高应用性能(仅在发生改变时才重绘内容,消除了动画的帧速率上的运行代码)


继承关系
        NSObject
            CAAnimation(抽象类)
                CAAnimationGroup (组动画)
                CATransition (转场动画)
                CAPropertyAnimation(抽象类)
                    CABasicAnimation (基础动画)
                        CASpringAnimation (弹簧动画)
                    CAKeyframeAnimation(关键帧动画)
CABasicAnimation 基础动画
        /* keyPath值:
         transform、transform.rotation、transform.rotation.x y z(旋转)、transform.scale、transform.scale.x y(缩放),contents 改变展示的图片、bounds、position、scale、opacity(透明度)、margin、zPosition、backgroundColor、cornerRadius、contentsRect、frame、shadowRadius、shadowOpacity、shadowOffset、shadowColor、masksToBounds、mask、hidden、strokeEnd、strokeStart
         */

        // 1.创建基础动画
        CABasicAnimation *scaleAnima=[CABasicAnimation animationWithKeyPath:@"transform.scale"];
        // 2.配置
        [scaleAnima setFromValue:@(1.0)];       // fromValue
        [scaleAnima setToValue:@(1.1)];         // toValue
        [scaleAnima setByValue:@(1.05)];        // byValue(叠加)
        [scaleAnima setDuration:2.0];           // 持续时间
        [scaleAnima setRepeatCount:10];         // 重复次数
        [scaleAnima setAutoreverses:true];      // 动画完成后是否反向还原
        [scaleAnima setFillMode:kCAFillModeForwards];   // 动画结束后保留最后状态
/*    
fillMode(动画结束后Mode):
    kCAFillModeForwards     保留最后状态
    kCAFillModeBackwards    返回初始状态
    kCAFillModeBoth
    kCAFillModeRemoved
*/
        [scaleAnima setTimingFunction:[CAMediaTimingFunction functionWithControlPoints:0.25 : -0.4:0.5 :1]];    //
        [scaleAnima setBeginTime:CACurrentMediaTime()+1];
        // 3.添加
        [self.view.layer addAnimation:scaleAnima forKey:@"ssbb"];

        // 删除所有动画
        [self.view.layer removeAllAnimations];
        // 删除指定动画
        [self.view.layer removeAnimationForKey:@"ssbb"];
        // 获取指定的动画
        CAAnimation *an=[self.view.layer animationForKey:@"ssbb"];
CATransition 过渡转场动画
        // 1.创建
        CATransition *transition=[CATransition new];
        // 2.设置
        [transition setDuration:2.0];                                       // 动画 持续时间
        [transition setType:kCATransitionFade];                             // 动画 类型
        [transition setSubtype:kCATransitionFromLeft];                      // 动画 方向
        /*
         type 动画类型
         
         公开API
            kCATransitionFade kCATransitionPush kCATransitionMoveIn kCATransitionReveal  ==  fade(默认,交叉淡化)、push、moveIn、reveal
         私有API(有可能被拒)
            cube                             立方体翻转
            oglFlip                          上下翻转
            suckEffect                       收缩至左上方
            rippleEffect                     滴水
            rotate                           旋转
            pageCurl、pageUnCurl                             翻页(向上、向下)
            cameraIrisHollowOpen、cameraIrisHollowClose      相机
         
         
         subType 动画方向
            kCATransitionFromRight
            kCATransitionFromLeft
            kCATransitionFromTop
            kCATransitionFromBottom
         */
        [transition setStartProgress:0.1];                                  // 动画 初始状态
        [transition setEndProgress:0.8];                                    // 动画 结束状态
        [transition setFillMode:kCAFillModeForwards];                       //
        [transition setTimingFunction:UIViewAnimationCurveEaseInOut];       //
        [transition setDelegate:self];                                      // dele<CAAnimationDelegate>
        [transition setRemovedOnCompletion:true];
        [transition setBeginTime:CFAbsoluteTimeGetCurrent()];               // 动画 开始时间
        // 3.添加
        [self.view.layer addAnimation:transition forKey:@"ssbb"];
CAKeyframeAnimation 关键帧动画(连续动画)
        // 1.创建关键帧动画(连续动画)
        CAKeyframeAnimation *keyAni=[CAKeyframeAnimation animationWithKeyPath:@"position"];
        // 2.配置
        [keyAni setValues:@[@(10),@(50),@(20)]];                //
        [keyAni setTimingFunctions:@[[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut],[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseIn]]];                    // 每个动画的速度(value个数-1)
        [keyAni setKeyTimes:@[@(2.0),@(3.0)]];                  // 每个动画的持续时间
        [keyAni setPath:[UIBezierPath bezierPath].CGPath];      // 动画路径(贝塞尔曲线)
        [keyAni setRotationMode:kCAAnimationRotateAuto];        // 根据路径自动调整方向
         /*
         RotationMode
            kCAAnimationRotateAuto
            kCAAnimationRotateAutoReverse
         */
        [keyAni setCalculationMode:kCAAnimationPaced];          // 动画样式
        /*
         KCAAnimationLinear     自定义控制动画的时间(线性)可以设置keyTimes
         kCAAnimationDiscrete   离散动画 没有任何补间动画 使用keyTimes@[@0.3,@0.5,@@1.0];
         kCAAnimationPaced      节奏动画 自动计算动画的运动时间
         kCAAnimationCubic      曲线动画 需要设置timingFunctions
         kCAAnimationCubicPaced 节奏曲线动画 自动计算
         */
        [keyAni setDuration:5.0];
        [keyAni setRemovedOnCompletion:true];
        [keyAni setRepeatCount:10];
        [keyAni setBeginTime:CACurrentMediaTime()];
        [keyAni setFillMode:kCAFillModeForwards];
        [keyAni setAutoreverses:true];
        
        
        // 3.添加
        [self.view.layer addAnimation:keyAni forKey:@"ssbb"];
CASpringAnimation 弹簧动画
        // 1.创建弹簧动画
        CASpringAnimation *springAni=[CASpringAnimation animationWithKeyPath:@"position.y"];
        // 2.配置
        [springAni setDuration:2.0];
        [springAni setBeginTime:CACurrentMediaTime()];
        [springAni setTimingFunction:[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut]];
        [springAni setRepeatCount:true];
        [springAni setRemovedOnCompletion:true];
        [springAni setAutoreverses:true];
        [springAni setFromValue:@(0.1)];
        [springAni setToValue:@(0.8)];
        [springAni setFillMode:kCAFillModeForwards];
        [springAni setDamping:10.0];            // 阻力(阻力越大,停止越快)
        [springAni setMass:5.0];                // 质量(质量越大,幅度越大)
        [springAni setStiffness:50];            // 刚度(刚度越大,运动越快)
        [springAni setInitialVelocity:5.0];     // 初始速率(为负时与运动方向相反)
        // 3.添加
        [self.view.layer addAnimation:springAni forKey:@"ssbb"];
CAAnimationGroup 组动画
        CAAnimationGroup *groupAnimation=[CAAnimationGroup new];
        [groupAnimation setAnimations:@[]];                     // 动画 操作数组
        [groupAnimation setBeginTime:CACurrentMediaTime()];     // 动画 开始时间
        [groupAnimation setDuration:2.0];                       // 动画 持续时间
        [groupAnimation setAutoreverses:true];                  // 动画 是否反向执行
        [groupAnimation setRepeatCount:10];                     // 动画 持续次数
        [groupAnimation setRemovedOnCompletion:true];           // 动画 完成后是否移除
        [groupAnimation setTimingFunction:[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut]];    // 动画 时间类型
        
        [self.view.layer addAnimation:groupAnimation forKey:@"ssbb"];

相关

protocol CAMediaTiming 控制动画时间协议(每个CA动画都有)
            @property CFTimeInterval beginTime;     // 开始时间(默认:0)CACurrentMediaTime() + 秒数
            @property CFTimeInterval duration;      // 持续时间(默认:0)秒数
            @property float speed;                  // 速度(默认:1)为0则暂停动画,动画开始后则不能改变,=2时动画时间为duration/2,
            @property CFTimeInterval timeOffset;    // 从动画的某部分开始动画,将前部分放在后面执行
            @property float repeatCount;            // 重复次数(默认:1) INFINITY 无限
            @property CFTimeInterval repeatDuration;    // 重复时间段(默认:0),时间段内一直动画
            @property BOOL autoreverses;            // 动画结束后是否反方向动画(默认:false)
            @property(copy) NSString *fillMode;     // 动画之前之后的行为
            /*
                kCAFillModeForwards  (动画结束后保持状态,removedOnCompletion要=true)
                kCAFillModeBackwards  (动画开始前 便处于动画初始状态)
                kCAFillModeBoth      (1+2)
                kCAFillModeRemoved   (动画结束后回到原值)  默认
            */
         

        


CAAnimation : NSObject<NSCoding, NSCopying, CAMediaTiming, CAAction>
            @property(nullable, strong) CAMediaTimingFunction *timingFunction;
            /
            速度控制函数
                kCAMediaTimingFunctionLinear            (线性匀速) 默认
                kCAMediaTimingFunctionEaseIn            (越快)
                kCAMediaTimingFunctionEaseOut           (越慢)
                kCAMediaTimingFunctionEaseInEaseOut     (开始结束慢中间快:慢慢加速—慢慢减速)(UIView动画时此选项对应的为默认值)
                kCAMediaTimingFunctionDefault           (开始结束慢中间快:慢慢加速—慢慢减速)
            /
            @property(nullable, strong) id <CAAnimationDelegate> delegate;
            /
                - (void)animationDidStart:(CAAnimation *)anim;
                - (void)animationDidStop:(CAAnimation *)anim finished:(BOOL)flag;
            /
            @property(getter=isRemovedOnCompletion) BOOL removedOnCompletion;   // 画完毕后将动画从图层上移除(默认true),否则一直在内存直到图层被移除。false图形会恢复到动画执行前的状态。若不想恢复则置true且设置fillMode为kCAFillModeForwards
        */
3. 物理动画
4. 粒子动画
5. UIViewPropertyAnimator
UIViewPropertyAnimator : NSObject <UIViewImplicitlyAnimating, NSCopying>
    属性动画器(iOS10新增)
                         @protocol UIViewImplicitlyAnimating <UIViewAnimating>
                         @protocol UIViewAnimating <NSObject>

特性
     1. 可中断
     2. 可擦除
     3. 可反转
     4. 可时间控制
例

    // 创建动画要操作的View
    UIView *contentView=[UIView new];
    [contentView setBackgroundColor:[UIColor redColor]];
    [self.view addSubview:contentView];
    [contentView setFrame:CGRectMake(0, 0, 100, 100)];
    // 创建动画器
    UIViewPropertyAnimator *ani=[[UIViewPropertyAnimator alloc]initWithDuration:1.0 curve:UIViewAnimationCurveEaseIn animations:^{
        [contentView setFrame:CGRectMake(100, 100, 150, 150)];
    }];
    // 开始动画
    [ani startAnimation];
创建动画器 4方式

    // 方式1(持续时间,速度变化,动画操作)
    UIViewPropertyAnimator *ani=[[UIViewPropertyAnimator alloc]initWithDuration:1.0 curve:UIViewAnimationCurveEaseIn animations:^{
        // 动画操作
        [contentView setFrame:CGRectMake(100, 100, 150, 150)];
    }];
    /*
     UIViewAnimationCurveEaseInOut,         慢快慢
     UIViewAnimationCurveEaseIn,            慢快
     UIViewAnimationCurveEaseOut,           快慢
     UIViewAnimationCurveLinear,            匀速
     */


    // 方式2(持续时间)
    // 自定义阻尼振动
    // (阻尼系数,初始速度)
    UISpringTimingParameters *springP=[[UISpringTimingParameters alloc]initWithDampingRatio:0.7 initialVelocity:CGVectorMake(0, 1)];
    // (质量,弹性系数,阻尼系数,初始速度)
    /*
     弹性系数
       描述单位形变量时所产生弹力的大小,F = K * △X (F为弹力,K是劲度系数,△x是弹簧形变量)
     */
    UISpringTimingParameters *springP2=[[UISpringTimingParameters alloc]initWithMass:10 stiffness:10 damping:1 initialVelocity:CGVectorMake(0, 1)];
    // 自定义贝塞尔曲线
    UICubicTimingParameters *cubicP=[[UICubicTimingParameters alloc]initWithControlPoint1:CGPointMake(0, 0) controlPoint2:CGPointMake(1, 1)];
    UIViewPropertyAnimator *ani2=[[UIViewPropertyAnimator alloc]initWithDuration:1.0 timingParameters:springP];


    // 方式3(持续时间,阻尼系数,动画操作)
    /* 阻尼系数:
        1.欠阻尼(取值范围0~1.0 ,值越小振动效果越明显)
        2.临界阻尼 取值为1
        3.过阻尼(取值范围>1 ,值越大振动越不明显)
     */
    UIViewPropertyAnimator *ani3=[[UIViewPropertyAnimator alloc]initWithDuration:1.0 dampingRatio:1.0 animations:^{
        // 动画操作
    }];


    // 方式4(持续时间,贝塞尔控制点1(0~1.0),贝塞尔控制点2(0~1.0),动画操作)
    UIViewPropertyAnimator *ani4=[[UIViewPropertyAnimator alloc]initWithDuration:1.0 controlPoint1:CGPointMake(0, 0) controlPoint2:CGPointMake(0, 0) animations:^{
        // 动画操作
    }];
    // 获取 timingParameters(readOnly)
    id <UITimingCurveProvider> timingParameters=ani.timingParameters;
    // 获取 动画持续时间(readOnly)
    NSTimeInterval duration=ani.duration;
    // 获取 动画延迟时间(readOnly)
    NSTimeInterval delay=ani.delay;
    

    // 设置 是否可交互(Defaults to YES.)
    [ani setUserInteractionEnabled:true];
    // 获取 是否可交互
    BOOL isUserI=ani.isUserInteractionEnabled;
    
    // 设置 是否可中断(Defaults to YES.)
    [ani setInterruptible:true];
    // 获取 是否可中断
    BOOL isInterrupt=ani.isInterruptible;
    

    // iOS11
    // 设置 是否可擦除(Defaults to YES.)
    [ani setScrubsLinearly:true];
    // 获取 是否可擦除
    BOOL isScrubsLinearly=ani.scrubsLinearly;
    
    // iOS11
    // 设置 是否动画完成后暂停(Defaults to NO.)
    [ani setPausesOnCompletion:true];
    // 获取 是否动画完成后暂停
    BOOL pausesOnCompletion=ani.pausesOnCompletion;
    
    
    // 设置 Hit测试(Defaults to NO.)
    [ani setManualHitTestingEnabled:true];
    // 获取 Hit测试
    BOOL isManualHitTestingEnabled=ani.isManualHitTestingEnabled;
    // 获取 动画状态(readOnly)
    UIViewAnimatingState state=ani.state;
    /*
     UIViewAnimatingStateInactive, // 非活跃.
     UIViewAnimatingStateActive,   // 活跃.
     UIViewAnimatingStateStopped,  // 暂停.
     */
    // 获取 是否正在运行(readOnly)
    BOOL running=ani.isRunning;
    
    
    // 获取 是否反向
    BOOL isReversed=ani.isReversed;
    // 设置 是否反向
    [ani setReversed:true];
    
    // ?(0~1)
    CGFloat fractionComplete=ani.fractionComplete;
    

    // 添加动画
    [ani addAnimations:^{
    }];
    //
    [ani addCompletion:^(UIViewAnimatingPosition finalPosition) {
    }];
    //
    [ani addAnimations:^{
    } delayFactor:0.5];
    // 改变未完成的动画
    [ani continueAnimationWithTimingParameters:springP2 durationFactor:0.5];

    
    // inactive、active、stopped
    // 开始动画(或继续未完成的动画)
    [ani startAnimation];
    [ani startAnimationAfterDelay:1.0];
    // 暂停动画
    [ani pauseAnimation];
    // 结束动画(是否变为非活跃状态)
    [ani stopAnimation:true];
    // 结束动画
    [ani finishAnimationAtPosition:UIViewAnimatingPositionStart];
    /*
     UIViewAnimatingPositionEnd,        结束状态
     UIViewAnimatingPositionStart,      开始状态
     UIViewAnimatingPositionCurrent,    当前状态
     */
显示全文