<article class="_2rhmJa">
动画在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 //运算模式 :平滑均匀