动画在iOS开发中必不可少的元素,各种优美的页面、炫酷的交互效果离不开动画这个元素。今天对动画做一下学习和总结。
iOS开发中常用的动画主要有以下四种:UIView动画、核心动画、帧动画、自定义转场动画。
UIView动画——iOS开发中最常用的动画。
进入苹果原生方法库UIKit里面的UIView.h文件中,我们可以清楚看到苹果给我们提供了2中动画的实现方式,即普通方式和Block方式。
而我们一般会直接使用Block方式实现动画,简单方便。
现在我们两种实现方式都来学习一下。首先是普通方式。
1、普通方式
开始动画方法:
// 第一个参数: 动画标识
// 第二个参数: 附加参数,在设置代理情况下,此参数将发送到setAnimationWillStartSelector和setAnimationDidStopSelector所指定的方法,大部分情况,设置为nil.
[UIView beginAnimations:@"firstAnimation" context:nil];
设置动画参数:(参照需求,设置)
//动画持续时间
[UIView setAnimationDuration:2.f];
//动画的代理对象
[UIView setAnimationDelegate:self];
//设置动画将开始时代理对象执行的SEL
[UIView setAnimationWillStartSelector:@selector(startAnimation:)];
[UIView setAnimationDidStopSelector:@selector(stopAnimation:)];
//设置动画延迟执行的时间
[UIView setAnimationDelay:0.f];
//设置动画的重复次数
[UIView setAnimationRepeatCount:4];
//设置开始动画的时间,默认是now
[UIView setAnimationStartDate:[NSDate date]];
//设置动画的曲线
/*
UIViewAnimationCurve的枚举值:
UIViewAnimationCurveEaseInOut, // 慢进慢出(默认值)
UIViewAnimationCurveEaseIn, // 慢进
UIViewAnimationCurveEaseOut, // 慢出
UIViewAnimationCurveLinear // 匀速
*/
[UIView setAnimationCurve:UIViewAnimationCurveEaseInOut];
//设置是否从当前状态开始播放动画
/*假设上一个动画正在播放,且尚未播放完毕,我们将要进行一个新的动画:
当为YES时:动画将从上一个动画所在的状态开始播放
当为NO时:动画将从上一个动画所指定的最终状态开始播放(此时上一个动画马上结束)*/
[UIView setAnimationBeginsFromCurrentState:YES];
//设置动画是否继续执行相反的动画
[UIView setAnimationRepeatAutoreverses:NO];
//是否使用动画效果(对象属性依然会被改变,只是没有动画效果)YES使用;NO禁用
[UIView setAnimationsEnabled:YES];
//设置视图的过渡效果
/* 第一个参数:UIViewAnimationTransition的枚举值如下
UIViewAnimationTransitionNone, //不使用动画
UIViewAnimationTransitionFlipFromLeft, //从左向右旋转翻页
UIViewAnimationTransitionFlipFromRight, //从右向左旋转翻页
UIViewAnimationTransitionCurlUp, //从下往上卷曲翻页
UIViewAnimationTransitionCurlDown, //从上往下卷曲翻页
第二个参数:需要过渡效果的View
第三个参数:是否使用视图缓存,YES:视图在开始和结束时渲染一次;NO:视图在每一帧都渲染*/
[UIView setAnimationTransition:UIViewAnimationTransitionFlipFromRight forView:[[UIView alloc] initWithFrame:CGRectZero] cache:YES];
结束动画方法:
[UIView commitAnimations];
2、Block方式——简单方便
2.1、最简洁的Block动画:包含时间和动画
/**
* 第一个参数:动画持续时间
* 第二个参数:执行的动画代码块
*/
[UIView animateWithDuration:1.0
animations:^{
//执行的动画代码
}];
2.2、带有动画提交回调的Block动画
/**
* 第一个参数:动画持续时间
* 第二个参数:执行的动画代码块
* 第三个参数:动画执行完成之后的回调
*/
[UIView animateWithDuration:1.0
animations:^{
//执行的动画代码
}
completion:^(BOOLfinished) {
//动画执行完成之后的回调
}];
2.3、可以设置延时时间和过渡效果的Block动画
/**
* 第一个参数:动画持续时间
* 第二个参数:动画延时开始的时间
* 第三个参数:动画过渡效果的枚举值(主要有以下类型)
* 第四个参数:执行的动画代码
* 第五个参数:动画执行完成之后的回调
*/
[UIView animateWithDuration:1.0
delay:2.0
options:UIViewAnimationOptionCurveLinear
animations:^{
//执行的动画代码
}
completion:^(BOOLfinished) {
//动画执行完成之后的回调
}];
2.4、Spring动画
/**
* 第一个参数:动画持续时间
* 第二个参数:动画延时开始的时间
* 第三个参数:Spring动画,震动效果,范围0~1,数值越小震动效果越明显
* 第四个参数:初始速度,数值越大初始速度越快
* 第五个参数:动画的过渡效果
* 第六个参数:执行的动画代码
* 第七个参数:动画执行完成之后的回调
*/
[UIView animateWithDuration:1.0
delay:2.0
usingSpringWithDamping:0.5
initialSpringVelocity:100.f
options:UIViewAnimationOptionCurveLinear
animations:^{
}
completion:^(BOOLfinished) {
}];
2.5、Keyframes动画
/**
* 第一个参数:动画持续时间
* 第二个参数:动画延时开始的时间
* 第三个参数:动画的过渡效果:UIViewKeyframeAnimationOption
* 第四个参数:执行的动画代码
* 第五个参数:动画执行完成之后的回调
*/
[UIView animateKeyframesWithDuration:1.0
delay:2.0
options:UIViewKeyframeAnimationOptionRepeat
animations:^{
//执行的动画代码
}
completion:^(BOOLfinished) {
//动画执行完成之后的回调
}];
/**
* 第一个参数:动画开始的时间(占总时间的比例)
* 第二个参数:动画持续时间(占总时间的比例)
* 第三个参数:执行的动画
*/
[UIView addKeyframeWithRelativeStartTime:0.3
relativeDuration:0.7
animations:^{
//执行的动画代码
}];
2.6、转场动画——从旧视图到新视图的动画效果
/**
* 第一个参数:动画作用的view
* 第二个参数:动画持续时间
* 第三个参数:动画的过渡效果:UIViewAnimationOptions
* 第四个参数:执行的动画代码
* 第五个参数:动画执行完成之后的回调
*/
[UIView transitionWithView:(nonnullUIView *) duration:(NSTimeInterval) options:(UIViewAnimationOptions) animations:^{
} completion:^(BOOLfinished) {
}];
/**
* 第一个参数:动画作用的view:从父视图中移除
* 第二个参数:动画作用的view:添加到父视图中
* 第三个参数:动画持续时间
* 第四个参数:动画的过渡效果:UIViewAnimationOptions
* 第五个参数:动画执行完成之后的回调
*/
[UIView transitionFromView:(nonnullUIView *) toView:(nonnullUIView *) duration:(NSTimeInterval) options:(UIViewAnimationOptions) completion:^(BOOLfinished) {
//动画执行完成之后的回调
}];
在该动画过程中,fromView 会从父视图中移除,并将 toView 添加到父视图中,注意转场动画的作用对象是父视图(过渡效果体现在父视图上)。调用该方法相当于执行下面两句代码:
[fromView.superview addSubview:toView];
[fromView removeFromSuperview];
UIViewAnimationOption的的枚举值如下,可组合使用:
UIViewAnimationOptionLayoutSubviews //进行动画时布局子控件
UIViewAnimationOptionAllowUserInteraction //进行动画时允许用户交互
UIViewAnimationOptionBeginFromCurrentState //从当前状态开始动画
UIViewAnimationOptionRepeat //无限重复执行动画
UIViewAnimationOptionAutoreverse //执行动画回路
UIViewAnimationOptionOverrideInheritedDuration //忽略嵌套动画的执行时间设置
UIViewAnimationOptionOverrideInheritedCurve //忽略嵌套动画的曲线设置
UIViewAnimationOptionAllowAnimatedContent //转场:进行动画时重绘视图
UIViewAnimationOptionShowHideTransitionViews //转场:移除(添加和移除图层的)动画效果
UIViewAnimationOptionOverrideInheritedOptions //不继承父动画设置
UIViewAnimationOptionCurveEaseInOut //时间曲线,慢进慢出(默认值)
UIViewAnimationOptionCurveEaseIn //时间曲线,慢进
UIViewAnimationOptionCurveEaseOut //时间曲线,慢出
UIViewAnimationOptionCurveLinear //时间曲线,匀速
UIViewAnimationOptionTransitionNone //转场,不使用动画
UIViewAnimationOptionTransitionFlipFromLeft //转场,从左向右旋转翻页
UIViewAnimationOptionTransitionFlipFromRight //转场,从右向左旋转翻页
UIViewAnimationOptionTransitionCurlUp //转场,下往上卷曲翻页
UIViewAnimationOptionTransitionCurlDown //转场,从上往下卷曲翻页
UIViewAnimationOptionTransitionCrossDissolve //转场,交叉消失和出现
UIViewAnimationOptionTransitionFlipFromTop //转场,从上向下旋转翻页
UIViewAnimationOptionTransitionFlipFromBottom //转场,从下向上旋转翻页
UIViewKeyframeAnimationOptions的枚举值如下,可组合使用:
UIViewKeyframeAnimationOptionLayoutSubviews =UIViewAnimationOptionLayoutSubviews, //进行动画时布局子控件
UIViewKeyframeAnimationOptionAllowUserInteraction =UIViewAnimationOptionAllowUserInteraction, //进行动画时允许用户交互
UIViewKeyframeAnimationOptionBeginFromCurrentState =UIViewAnimationOptionBeginFromCurrentState, //从当前状态开始动画
UIViewKeyframeAnimationOptionRepeat =UIViewAnimationOptionRepeat, //无限重复执行动画
UIViewKeyframeAnimationOptionAutoreverse =UIViewAnimationOptionAutoreverse, //执行动画回路
UIViewKeyframeAnimationOptionOverrideInheritedDuration =UIViewAnimationOptionOverrideInheritedDuration,//忽略嵌套动画的执行时间设置
UIViewKeyframeAnimationOptionOverrideInheritedOptions =UIViewAnimationOptionOverrideInheritedOptions,//不继承父动画设置
UIViewKeyframeAnimationOptionCalculationModeLinear =0<<10, //运算模式 :连续
UIViewKeyframeAnimationOptionCalculationModeDiscrete =1<<10, //运算模式 :离散
UIViewKeyframeAnimationOptionCalculationModePaced =2<<10, //运算模式 :均匀执行
UIViewKeyframeAnimationOptionCalculationModeCubic =3<<10, //运算模式 :平滑
UIViewKeyframeAnimationOptionCalculationModeCubicPaced =4<<10 //运算模式 :平滑均匀