在开发工作中,我们会碰到大量的需要表现力的地方,那么动画便成为了我们开发过程中必不可少的知识点。
那么,首先我们从最简单的入手:
一、UIView动画类方法动画
UIView动画其实就是对Core Animation的封装,并提供给开发者更加简洁易懂的API接口。
相对于Core Animation动画来说,UIView动画提供的动画属性较少:
1、大小变化(frame)
2、拉伸变化(bounds)
3、中心位置(center)
4、旋转(transform)
5、透明度(alpha)
6、背景颜色(backgroundColor)
7、拉伸内容(contentStretch)
下面介绍一下UIView基础动画的几个常用的方法:
1、标志动画开始,开始编辑动画
+ (void)beginAnimations:(nullable NSString *)animationID context:(nullable void *)context;
animationID:动画的唯一标示
context:附加参数
2、标志动画结束,开始执行动画
+ (void)commitAnimations;
3、设置动画时长
+ (void)setAnimationDuration:(NSTimeInterval)duration;
4、设置代理
+ (void)setAnimationDelegate:(nullable id)delegate;
5、动画将要开始时执行的方法
+ (void)setAnimationWillStartSelector:(nullable SEL)selector;
6、动画已经结束时执行的方法
+ (void)setAnimationDidStopSelector:(nullable SEL)selector;
7、设置动画执行延时时间
+ (void)setAnimationDelay:(NSTimeInterval)delay;
8、设置动画开始的Date
+ (void)setAnimationStartDate:(NSDate *)startDate;
9、设置动画效果
+ (void)setAnimationCurve:(UIViewAnimationCurve)curve;
效果如下:
UIViewAnimationCurveEaseInOut, // 慢入慢出
UIViewAnimationCurveEaseIn, // 慢入
UIViewAnimationCurveEaseOut, // 慢出
UIViewAnimationCurveLinear, // 线性匀速
10、设置动画重复次数
+ (void)setAnimationRepeatCount:(float)repeatCount;
11、设置动画是否继续执行反相动画
+ (void)setAnimationRepeatAutoreverses:(BOOL)repeatAutoreverses;
12、设置是否从当前状态开始动画
+ (void)setAnimationBeginsFromCurrentState:(BOOL)fromCurrentState;
当一个动画尚未完成,将要进行下一个动画时:
如果设置为YES,动画将从上一个动画当前的状态进行下一个动画
如果设置为NO,那当前动画会立即结束,达到当前动画的最终状态,再执行下一个动画
13、设置试图过渡效果
+ (void)setAnimationTransition:(UIViewAnimationTransition)transition forView:(UIView *)view cache:(BOOL)cache;
transition:动画效果
UIViewAnimationTransitionNone, //不适用动画
UIViewAnimationTransitionFlipFromLeft, //从左向右旋转翻页
UIViewAnimationTransitionFlipFromRight, //从右向左旋转翻页
UIViewAnimationTransitionCurlUp, //从下往上卷曲翻页
UIViewAnimationTransitionCurlDown, //从上往下卷曲翻页
view:添加动画效果的View
cache:是否使用视图缓存,YES:视图在开始和结束时渲染一次;NO:视图在每一帧都渲染
14、是否禁用动画效果(对象的属性会被改变,只是没有动画效果)
+ (void)setAnimationsEnabled:(BOOL)enabled;
下面为集中常见的动画样式:
1、frame动画
-(void)frameAnimation{
[UIView beginAnimations:@"animation_frame" context:nil];
[UIView setAnimationDelay:0.3];
[UIView setAnimationDuration:1];
[UIView setAnimationRepeatAutoreverses:YES];
[UIView setAnimationRepeatCount:CGFLOAT_MAX];
[UIView setAnimationCurve:UIViewAnimationCurveLinear];
[UIView setAnimationDelegate:self];
[UIView setAnimationWillStartSelector:@selector(aniBegin:)];
[UIView setAnimationDidStopSelector:@selector(aniStop:)];
view_2.frame = view_0.frame;
[UIView commitAnimations];
}
2、给某一个view添加转场动画
-(void)touchesBegan:(NSSet*)touches withEvent:(UIEvent *)event{
[UIView beginAnimations:@"animation_flip" context:nil];
[UIView setAnimationDelay:0.3];
[UIView setAnimationDuration:1];
[UIView setAnimationRepeatAutoreverses:NO];
[UIView setAnimationRepeatCount:CGFLOAT_MAX];
[UIView setAnimationCurve:UIViewAnimationCurveLinear];
[UIView setAnimationDelegate:self];
[UIView setAnimationWillStartSelector:@selector(aniBegin:)];
[UIView setAnimationDidStopSelector:@selector(aniStop:)];
[UIView setAnimationTransition:UIViewAnimationTransitionFlipFromLeft forView:view_0 cache:YES];
[UIView commitAnimations];
}
二、UIView Block动画
Block动画对于开发来说更加的简洁易操作,有如下几种方法:
1、 最简单的动画方式
+ (void)animateWithDuration:(NSTimeInterval)duration animations:(void (^)(void))animations
duration:动画时长
animations:需要执行的动画
2、 带有完成回调的动画方式
+ (void)animateWithDuration:(NSTimeInterval)duration animations:(void (^)(void))animations completion:(void (^ __nullable)(BOOL finished))completion
completion:动画完成时的Block回调
3、 带有延时和可选择动画效果的动画方式
+ (void)animateWithDuration:(NSTimeInterval)duration delay:(NSTimeInterval)delay options:(UIViewAnimationOptions)options animations:(void (^)(void))animations completion:(void (^ __nullable)(BOOL finished))completion
delay:延时执行时间
options:动画效果(具体效果参考系统枚举)
4、 spring动画
+ (void)animateWithDuration:(NSTimeInterval)duration delay:(NSTimeInterval)delay usingSpringWithDamping:(CGFloat)dampingRatio initialSpringVelocity:(CGFloat)velocity options:(UIViewAnimationOptions)options animations:(void (^)(void))animations completion:(void (^ __nullable)(BOOL finished))completion
duration:动画时长
delay:延时时间
dampingRatio:震动效果,范围0~1,数值越小震动效果越明显
velocity:初始速度,数值越大初始速度越快
options:动画效果
5、转场动画
(1)、两个视图切换
+ (void)transitionFromView:(UIView *)fromView toView:(UIView *)toView duration:(NSTimeInterval)duration options:(UIViewAnimationOptions)options completion:(void (^ __nullable)(BOOL finished))completion
在该动画过程中,fromView 会从父视图中移除,并讲 toView 添加到父视图中,注意转场动画的作用对象是父视图。
(2)、单个视图转场效果
+ (void)transitionWithView:(UIView *)view duration:(NSTimeInterval)duration options:(UIViewAnimationOptions)options animations:(void (^ __nullable)(void))animations completion:(void (^ __nullable)(BOOL finished))completion
6、 关键帧(keyFrame)动画
+ (void)animateKeyframesWithDuration:(NSTimeInterval)duration delay:(NSTimeInterval)delay options:(UIViewKeyframeAnimationOptions)options animations:(void (^)(void))animations completion:(void (^ __nullable)(BOOL finished))completion
其中需要注意的是添加关键帧的方法:
+ (void)addKeyframeWithRelativeStartTime:(double)frameStartTime relativeDuration:(double)frameDuration animations:(void (^)(void))animations
其中,frameStartTime为动画开始的时间(数值为占总时间的比例)
frameDuration为动画持续时间(数值为占总时间的比例)
总体而言,UIView的动画效果实现起来都比较简单,但是想要利用这些简单的东西完成一个复杂酷炫的动画并不是轻而易举的事情,当然,在大量复杂动画的情况下,配合使用高性能核心动画完成动画效果才是最佳的选择。