在iOS开发中,动画效果可以让应用更加生动、吸引人的眼球,提升用户体验。UIView是iOS中常用的视图控件,其内置了许多动画效果API,能够轻松实现各种动画效果。本文将从基础知识到高阶应用,全面详细地讲解如何使用UIView来实现动画效果。
动画的本质
动画就是将一系列静态的图片连续播放,以达到运动的效果。在iOS中,动画的本质也是如此,只不过是通过改变视图的属性值,使其在一段时间内呈现出一种渐变的效果。
动画的两种实现方式
在UIView中,实现动画效果有两种方式:
- 使用block-based API
- 使用核心动画(Core Animation)
对于简单的动画效果,使用block-based API即可;而对于较为复杂的动画效果,使用核心动画会更加方便,也更加灵活。
动画的主要属性
在UIView中,常用的动画属性有以下几个:
- frame:视图的位置和大小
- bounds:视图内容的大小
- center:视图的中心点坐标
- alpha:视图的透明度
- backgroundColor:视图的背景颜色
- transform:视图的形变效果,如旋转,缩放,平移等
- contentStretch:拉伸视图内容的边界区域
动画选项
在使用UIView动画时,可以使用动画选项来控制动画的一些行为。以下是一些常用的动画选项:
- UIViewAnimationOptionCurveEaseInOut:动画由慢至快再由快至慢
- UIViewAnimationOptionCurveEaseIn:动画由慢至快
- UIViewAnimationOptionCurveEaseOut:动画由快至慢
- UIViewAnimationOptionCurveLinear:动画匀速进行
- UIViewAnimationOptionAutoreverse:使动画在完成后自动反转。
- UIViewAnimationOptionRepeat:使动画重复执行。
动画的基本使用
基本动画
UIView中提供了一个非常简单易用的方法,可以帮助我们实现简单的动画效果:
1
+ (void)animateWithDuration:(NSTimeInterval)duration animations:(void (^)(void))animations;
其中,duration表示动画时长,animations是一个block,用来设置动画的属性值。
例如,下面这段代码可以实现一个简单的位移动画。在1秒钟内,将self.view的中心点移动到坐标(200, 200)处。
1
2
3
[UIView animateWithDuration:1.0 animations:^{
self.view.center = CGPointMake(200, 200);
}];
动画的回调
在UIView的动画API中,还允许我们设置动画完成后的回调函数:
1
+ (void)animateWithDuration:(NSTimeInterval)duration animations:(void (^)(void))animations completion:(void (^)(BOOL finished))completion;
其中,completion是一个block,用来处理动画完成后的操作。
例如,下面这段代码可以实现一个动画完成后输出log信息的功能。
1
2
3
4
5
[UIView animateWithDuration:1.0 animations:^{
self.view.center = CGPointMake(200, 200);
} completion:^(BOOL finished) {
NSLog(@"animation completed!");
}];
关键帧动画
UIView的关键帧动画API可以让我们实现更为复杂的动画效果。关键帧动画就是指,在动画过程中,设置多个关键帧,每个关键帧都有自己的属性值,通过这些关键帧组合起来,形成一个复杂的动画效果。
例如,下面这段代码可以实现一个关键帧动画。在3秒钟内,将self.view旋转四次,每次旋转90度。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
[UIView animateKeyframesWithDuration:3.0 delay:0.0 options:0 animations:^{
// 第一帧
[UIView addKeyframeWithRelativeStartTime:0.0 relativeDuration:0.25 animations:^{
self.view.transform = CGAffineTransformMakeRotation(M_PI_4);
}];
// 第二帧
[UIView addKeyframeWithRelativeStartTime:0.25 relativeDuration:0.25 animations:^{
self.view.transform = CGAffineTransformMakeRotation(M_PI_2);
}];
// 第三帧
[UIView addKeyframeWithRelativeStartTime:0.5 relativeDuration:0.25 animations:^{
self.view.transform = CGAffineTransformMakeRotation(3 * M_PI_4);
}];
// 第四帧
[UIView addKeyframeWithRelativeStartTime:0.75 relativeDuration:0.25 animations:^{
self.view.transform = CGAffineTransformMakeRotation(2 * M_PI);
}];
} completion:nil];
转场动画
UIView还提供了一个特殊的动画效果,叫做转场动画(Transition Animation)。转场动画通常用于在两个视图之间进行切换,比如在切换页面时使用。
例如,下面这段代码可以实现一个转场动画。在1秒钟内,将self.view的背景颜色从原来的颜色翻转到红色。
1
2
3
[UIView transitionWithView:self.view duration:1.0 options:UIViewAnimationOptionTransitionFlipFromLeft animations:^{
self.view.backgroundColor = [UIColor redColor];
} completion:nil];
UIViewPropertyAnimator
UIViewPropertyAnimator是iOS 10中新增的动画类,它可以让我们更加方便地管理动画效果。相比于上面介绍的UIView的动画API,UIViewPropertyAnimator提供了更多的控制选项,比如暂停、恢复、反向等。
例如,下面这段代码可以实现一个使用UIViewPropertyAnimator的动画,并添加暂停、恢复和反转功能。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
UIViewPropertyAnimator *animator = [[UIViewPropertyAnimator alloc] initWithDuration:2.0 curve:UIViewAnimationCurveEaseInOut animations:^{
self.view.center = CGPointMake(200, 200);
}];
[animator startAnimation];
// 暂停动画
[animator pauseAnimation];
// 恢复动画
[animator continueAnimationWithTimingParameters:nil durationFactor:0.0];
// 反转动画
[animator isReversed] ? [animator setReversed:NO] : [animator setReversed:YES];
// 结束动画
[animator stopAnimation:YES];