目录
1. UIView动画
1.1 animateWithDuration
1.2 beginAnimations
1.3 形变CGAffineTransform
2. CoreAnimation核心动画
3. 物理动画UIDynamicAnimator
4. 粒子动画CAEmitterLayer
5. UIViewPropertyAnimator属性动画器(iOS10)
简介
动画【可嵌套】:
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.1 initialSpringVelocity:0 options:UIViewAnimationOptionCurveEaseOut animations:^{
} completion:^(BOOL finished) {
}];
转场动画
切换整页界面(可以用来切换2端:修改rootVC)
[UIView transitionFromView:vc.view toView:vc2.view duration:2.0 options:UIViewAnimationOptionTransitionFlipFromLeft completion:^(BOOL finished) {
}];
操作指定View
[UIView transitionWithView:[UIView new] duration:2.0 options: UIViewAnimationOptionTransitionFlipFromLeft animations:^{
} completion:^(BOOL finished) {
}];
控件消失动画
[UIView performWithoutAnimation:^{
}];
[UIView performSystemAnimation:UISystemAnimationDelete onViews:@[[UIView new]] options:UIViewAnimationOptionCurveEaseOut animations:^{
} completion:^(BOOL finished) {
}];
关键帧动画(分段动画)
[UIView animateKeyframesWithDuration:2.0 delay:1.0 options:UIViewKeyframeAnimationOptionCalculationModeCubic animations:^{
// 0时间点 执行1/3时长
[UIView addKeyframeWithRelativeStartTime:0 relativeDuration:1/3 animations:^{
}];
// 1/3时间点 执行2/3时长
[UIView addKeyframeWithRelativeStartTime:1/3 relativeDuration:2/3 animations:^{
}];
} completion:^(BOOL finished) {
}];
参数说明:
duration:动画持续时间(以s为单位)
delay:动画延迟时间
completion:动画完成后的操作
animations:动画操作
frame、bounds、center
alpha、backgroundColor
transform
约束(单独设置无效,修改后需再调用[self layoutIfNeeded])
damping:阻力(0~1越小越弹,为1则平滑到最终值不振荡)
velocity:初始速率(0~1,通常是0,总距离*velocity=初始速度)
options:动画类型
速度
UIViewAnimationOptionCurveEaseInOut 时间曲线函数——由慢到快到慢 默认
UIViewAnimationOptionCurveEaseIn 时间曲线函数——由慢到快
UIViewAnimationOptionCurveEaseOut 时间曲线函数——由快到慢
UIViewAnimationOptionCurveLinear 时间曲线函数——匀速
方向[仅限转场动画]
UIViewAnimationOptionTransitionNone 无转场动画
UIViewAnimationOptionTransitionFlipFromLeft 左到右
UIViewAnimationOptionTransitionFlipFromRight 右到左
UIViewAnimationOptionTransitionCurlUp 翻页上
UIViewAnimationOptionTransitionCurlDown 翻页下
UIViewAnimationOptionTransitionCrossDissolve 交叉消失
UIViewAnimationOptionTransitionFlipFromTop 上到下
UIViewAnimationOptionTransitionFlipFromBottom 下到上
过程
UIViewAnimationOptionRepeat 重复动画(completion无效)
UIViewAnimationOptionAutoreverse 动画完成后反向(前提:设置无限循环)
UIViewAnimationOptionAllowUserInteraction 动画时允许交互(默认:不许交互)
UIViewAnimationOptionLayoutSubviews 子控件与父控件一起动画
UIViewAnimationOptionBeginFromCurrentState 从当前状态开始动画
UIViewAnimationOptionOverrideInheritedDuration 忽略外层动画的执行时间
UIViewAnimationOptionOverrideInheritedCurve 忽略外层动画的时间变换曲线
UIViewAnimationOptionOverrideInheritedOptions 忽略外层动画的属性
UIViewAnimationOptionAllowAnimatedContent 通过改变属性和重绘实现动画
UIViewAnimationOptionShowHideTransitionViews 用隐现的方式实现动画
options:关键帧动画类型
//
连续性动画(连续的)
UIViewKeyframeAnimationOptionCalculationModeLinear
离散性动画(不连续的---蹦来蹦去)
UIViewKeyframeAnimationOptionCalculationModeDiscrete
均匀(自动计算---忽略起始和结束时间,只需设置时间段)
UIViewKeyframeAnimationOptionCalculationModePaced
平滑
UIViewKeyframeAnimationOptionCalculationModeCubic
平滑均匀
UIViewKeyframeAnimationOptionCalculationModeCubicPaced
//
子控件与父控件一起动画
UIViewKeyframeAnimationOptionLayoutSubviews = UIViewAnimationOptionLayoutSubviews,
动画时允许交互
UIViewKeyframeAnimationOptionAllowUserInteraction = UIViewAnimationOptionAllowUserInteraction,
从当前状态开始动画(而不是初始值)
UIViewKeyframeAnimationOptionBeginFromCurrentState = UIViewAnimationOptionBeginFromCurrentState,
重复动画(导致completion不会执行)
UIViewKeyframeAnimationOptionRepeat = UIViewAnimationOptionRepeat,
动画后后返回(前提设置无限循环)
UIViewKeyframeAnimationOptionAutoreverse = UIViewAnimationOptionAutoreverse,
忽略外层动画的执行时间
UIViewKeyframeAnimationOptionOverrideInheritedDuration = UIViewAnimationOptionOverrideInheritedDuration,
忽略外层动画的时间变换曲线
UIViewKeyframeAnimationOptionOverrideInheritedOptions = UIViewAnimationOptionOverrideInheritedOptions,
1.2 beginAnimations
// 1.start
[UIView beginAnimations:nil context:nil];
// 2.set
// 动画持续时间
[UIView setAnimationDuration:2.0];
// 动画延迟时间
[UIView setAnimationDelay:1.0];
// 动画开始时间
[UIView setAnimationStartDate:[NSDate new]];
// 动画重复次数
[UIView setAnimationRepeatCount:10];
// 动画速度曲线
[UIView setAnimationCurve:UIViewAnimationCurveEaseInOut];
// 动画完成后是否反向返回
[UIView setAnimationRepeatAutoreverses:true];
// 是否从当前状态开始动画(而不是初始状态)
[UIView setAnimationBeginsFromCurrentState:true];
// 页面翻转
[UIView setAnimationTransition:UIViewAnimationTransitionCurlUp forView:self.view cache:true];
// delegate
[UIView setAnimationDelegate:self];
// 动画结束后调用的方法
[UIView setAnimationDidStopSelector:@selector(didStopAnima)];
// 动画开始前调用的方法
[UIView setAnimationWillStartSelector:@selector(willStartAnima)];
// ?
[UIView setAnimationsEnabled:true];
// 3.动画操作(同1.1中操作)
// 4.commit
[UIView commitAnimations];
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(关键帧动画)
添加动画
[self.view.layer addAnimation:scaleAnima forKey:@"ssbb"];
删除动画
// 删除所有动画
[self.view.layer removeAllAnimations];
// 删除指定动画
[self.view.layer removeAnimationForKey:@"ssbb"];
获取指定的动画
CAAnimation *an=[self.view.layer animationForKey:@"ssbb"];
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
*/
/*
position.x = frame.origin.x + 0.5 * bounds.size.width;
position.y = frame.origin.y + 0.5 * bounds.size.height;
*/
// 1.创建基础动画
CABasicAnimation *scaleAnima=[CABasicAnimation animationWithKeyPath:@"transform.scale"];
// 2.配置
[scaleAnima setFromValue:@(1.0)]; // fromValue
[scaleAnima setToValue:@(1.1)]; // toValue
// [scaleAnima setByValue:@(1.05)]; // byValue(叠加)
[scaleAnima setBeginTime:CACurrentMediaTime()+1]; // 开始时间
[scaleAnima setDuration:2.0]; // 持续时间
[scaleAnima setRepeatCount:10]; // 重复次数
[scaleAnima setTimingFunction:[CAMediaTimingFunction functionWithControlPoints:0.25 : -0.4:0.5 :1]]; // 速度曲线
[scaleAnima setAutoreverses:true]; // 动画完成后是否反向还原(默认:false)
[scaleAnima setFillMode:kCAFillModeForwards]; // 动画结束后保留最后状态
/*
fillMode(动画结束后Mode):
kCAFillModeForwards 保留最后状态
kCAFillModeBackwards 返回初始状态
kCAFillModeBoth
kCAFillModeRemoved
*/
/*
设置 fromValue 和 toValue:从 fromValue 变化到 toValue
设置 fromValue 和 byValue:从 fromValue 变化到 fromValue + byValue
设置 byValue 和 toValue:从 toValue - byValue 变化到 toValue
设置 fromValue: 从 fromValue 变化到属性当前值
设置 toValue:从属性当前值变化到 toValue
设置 byValue:从属性当前值变化到属性当前值 + toValue
*/
/*
kCAMediaTimingFunctionLinear 线性动画
kCAMediaTimingFunctionEaseIn 先快后慢
kCAMediaTimingFunctionEaseOut 先慢后快
kCAMediaTimingFunctionEaseInEaseOut 先慢后快再慢
kCAMediaTimingFunctionDefault 默认,也属于中间比较快
*/
// 3.添加
[self.view.layer addAnimation:scaleAnima forKey:@"ssbb"];
CATransition 过渡转场动画
// 1.创建
CATransition *transition=[CATransition new];
// 2.设置
// 动画 开始时间
[transition setBeginTime:CFAbsoluteTimeGetCurrent()];
// 动画 持续时间
[transition setDuration:2.0];
// 速度曲线
[transition setTimingFunction:UIViewAnimationCurveEaseInOut];
// 动画 初始状态,默认0(0%)
[transition setStartProgress:0.1];
// 动画 结束状态,默认1(100%)
[transition setEndProgress:0.8];
// 动画 类型
[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 setFillMode:kCAFillModeForwards]; // 完成后mode
[transition setRemovedOnCompletion:true];
[transition setDelegate:self]; // dele
// 3.添加
[self.view.layer addAnimation:transition forKey:@"ssbb"];
CATransition 可以用于 View 或 ViewController 直接的换场动画
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)]]; // 每个动画的持续时间
// path 只对 CALayer 的 anchorPoint 和position 属性起作用
// 如果你设置了 path ,那么 values 将被忽略
[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 setBeginTime:CACurrentMediaTime()];
[keyAni setDuration:5.0];
[keyAni setRepeatCount:10];
[keyAni setRemovedOnCompletion:true];
[keyAni setFillMode:kCAFillModeForwards];
[keyAni setAutoreverses:true];
// 3.添加
[self.view.layer addAnimation:keyAni forKey:@"ssbb"];
CASpringAnimation 弹簧动画
// 1.创建弹簧动画
CASpringAnimation *springAni=[CASpringAnimation animationWithKeyPath:@"position.y"];
// 2.配置
[springAni setFromValue:@(0.1)];
[springAni setToValue:@(0.8)];
[springAni setBeginTime:CACurrentMediaTime()];
[springAni setDuration:2.0];
[springAni setRepeatCount:2];
[springAni setTimingFunction:[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut]];
[springAni setRemovedOnCompletion:true];
[springAni setAutoreverses:true];
[springAni setFillMode:kCAFillModeForwards];
[springAni setDamping:10.0]; // 阻力(阻力越大,停止越快,默认10)必须大于等于0
[springAni setMass:5.0]; // 质量(质量越大,幅度越大)必须大于等于0
[springAni setStiffness:50]; // 刚度(刚度越大,运动越快,默认100)必须大于等于0
[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 setRepeatCount:10]; // 动画 持续次数
[groupAnimation setTimingFunction:[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut]]; // 动画 速度曲线
[groupAnimation setAutoreverses:true]; // 动画 是否反向执行
[groupAnimation setRemovedOnCompletion:true]; // 动画 完成后是否移除
[self.view.layer addAnimation:groupAnimation forKey:@"ssbb"];
一个 group 组内的某个动画的持续时间(duration),如果超过了整个组的动画持续时间,那么多出的动画时间将不会被展示。例如一个 group 的持续时间是 5s,而组内一个动画持续时间为 10s ,那么这个 10s 的动画只会展示前 5s 。
相关
CAAnimation : NSObject
@property(nullable, strong) CAMediaTimingFunction *timingFunction;
//
速度控制函数
kCAMediaTimingFunctionLinear (线性匀速) 默认
kCAMediaTimingFunctionEaseIn (越快)
kCAMediaTimingFunctionEaseOut (越慢)
kCAMediaTimingFunctionEaseInEaseOut (开始结束慢中间快:慢慢加速—慢慢减速)(UIView动画时此选项对应的为默认值)
kCAMediaTimingFunctionDefault (开始结束慢中间快:慢慢加速—慢慢减速)
//
@property(nullable, strong) id delegate;
//
- (void)animationDidStart:(CAAnimation *)anim;
- (void)animationDidStop:(CAAnimation *)anim finished:(BOOL)flag;
//
@property(getter=isRemovedOnCompletion) BOOL removedOnCompletion; // 画完毕后将动画从图层上移除(默认true,立刻回到原状态),否则一直在内存直到图层被移除。false图形会恢复到动画执行前的状态。若不想恢复则置true且设置fillMode为kCAFillModeForwards
*/
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要=false)
kCAFillModeBackwards (动画开始前 便处于动画初始状态)
kCAFillModeBoth (1+2)
kCAFillModeRemoved (动画结束后回到原值) 默认
*/
3. 物理动画 UIDynamicAnimator
UIGravityBehavior:重力行为
UICollisionBehavior:碰撞行为
UISnapBehavior:捕捉行为
UIPushBehavior:推动行为
UIAttachmentBehavior:附着行为
UIDynamicItemBehavior:动力元素行为
例(片段)
self.animator = [[UIDynamicAnimator alloc] initWithReferenceView:self.view];
UIGravityBehavior* gravityBehavior = [[UIGravityBehavior alloc] initWithItems:@[self.myView]];
[self.animator addBehavior:gravityBehavior];
UICollisionBehavior* collisionBehavior = [[UICollisionBehavior alloc] initWithItems:@[self.myView]];
collisionBehavior.translatesReferenceBoundsIntoBoundary = YES;
[self.animator addBehavior:collisionBehavior];
4. 粒子动画 CAEmitterLayer
CAEmitterLayer 是 Core Animation 提供的一个粒子发生器系统,可以用于创建各种粒子动画,例如烟雾,焰火等效果。
5. UIViewPropertyAnimator
UIViewPropertyAnimator : NSObject
属性动画器(iOS10新增)
@protocol UIViewImplicitlyAnimating
@protocol UIViewAnimating
特性
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 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, 当前状态
*/