目录
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, 当前状态
*/