iOS 开发之动画篇 - 从 UIView 动画说起

时间:2016-04-01 18:13:32   收藏:0   阅读:228

毋庸置疑的:在iOS开发中,制作动画效果是最让开发者享受的环节之一。一个设计严谨、精细的动画效果能给用户耳目一新的效果,吸引他们的眼光 —— 这对于app而言是非常重要的。

本文作为动画文集的第一篇,最开始是想做个qq下拉刷新的水滴动画的制作讲解,但这几天研读《iOS Animations by Tutorials》一书,对iOS动画开发有了更为深刻的了解,于是决定动画篇将从UIView动画开始讲起,以后还会有Layer、Transitioning等在内的动画,希望本文能抛砖引玉,带给大家不一样的理解,下面送上一张书中demo的效果图。购买书籍

技术分享
动效

先放上本文demo:点这
ps:本文属于新手向的动画入门文章

从登录动画说起


很长一段时间以来,我都在基于CALayer层进行动画实现,却忽略了UIKit提供给我们的动画接口。这些接口函数足够的强大并且十分的灵活,足以满足我们开发中大部分的动画需求。

在我们了解这些强大的接口前,我们先来看看第一个效果:在用户打开app要进行登录的时候,账户和密码输入框从屏幕的左边进入,接着登录按钮出现。

技术分享
界面动画


在这段动画之中发生的最为明显的事情就是两个文本框的位置变化,在动画开始之前,两个文本框的位置应该是在屏幕的左边,而下方的按钮现在是隐藏状态(设置alpha)

技术分享
动画开始前


因此,这个动画之中发生的事情,我们可以用概括为下面的代码:

self.userName.center.x += offset;    //userName进入
self.password.center.x += offset;    //password进入
self.login.alpha = 1;                //显示登录按钮

既然已经知道了我们的动画发生了什么,接着就可以使用UIKit的动画API让我们的动画活起来了

[js] view plain copy
  1. //设置文本框初始位置为屏幕左侧  
  2. CGPoint accountCenter = self.userName.center;  
  3. CGPoint psdCenter = self.password.center;  
  4. accountCenter.x -= 200;  
  5. pasCenter.x -= 200;  
  6. self.userName.center = accountCenter;  
  7. self.password.center = psdCenter;  
  8.   
  9. //还原中心坐标  
  10. accountCenter.x += 200;  
  11. psdCenter.x += 200;          
  12. [UIView animateWithDuration: 0.5 animations: ^{  
  13.   self.userName.center = accountCenter;  
  14.   self.password.center = passwordCenter;  
  15.     self.login.alpha = 1;  
  16. } completion: nil];  

在UIKit中,系统提供了animate标题打头的属于UIView的类方法让我们可以轻松的制作动画效果,每一个这样的类方法提供了名为animationsblock代码块,这些代码会在方法调用后立刻或者延迟一段时间以动画的方式执行。此外,所有这些API的第一个参数都是用来设置动画时长的。

viewDidAppear:中运行这段代码,你会看到文本框从左侧滑动,按钮也渐变显示出来的,但是跟我们要的结果不太一样 —— 三个动画没有错开,效果并不那么的好看。我们希望密码框能在账户文本框滑动后的一段时间后再出现,按钮同样也需要晚一些显示。所以,我们需要使用下面的方法来实现这个效果:

[js] view plain copy
  1. [UIView animateWithDuration: 0.5 delay: 0.35 options: UIViewAnimationOptionCurveEaseInOut animations: ^{  
  2.   self.password.center = passwordCenter;  
  3. } completion: ^(BOOL finished) {  
  4.   [UIView animateWithDuration: 0.2 animations: ^{  
  5.     self.login.alpha = 1;  
  6.   }];  
  7. }];  

这个方法看起来非常的熟悉,相比上面的方法这里多了几个参数来高度定制我们的动画:

在上面的代码中,密码输入框在延后0.35秒之后开始从左侧出来,在持续0.5秒的动画之后,开始渐变显示按钮,然后动画完成。

可实现动画的属性


现在你已经可以制作简单的动画了,但要记住:不是所有修改属性的操作放到animations代码块中都是变成动画实现的 —— 不管你怎么修改一个视图的tag,或者是delegate。因此,可实现动画的属性必定会导致视图的重新渲染。
这些可以生成动画的属性大致可以分成这么三类:坐标尺寸视图显示形态变化

坐标尺寸类

视图显示类

形态变化类

动画参数


上面我们使用到的动画方法中有一个重要的参数options,它能让你高度的自定义动画效果。下面展示这个参数类型的值集合,你可以通过结合不同的参数来实现自己的动画:

弹簧动画


恭喜你,你已经可以使用UIKit的动画接口制作精美的动画了,通过组合不同的options参数你可以制作真实的动画。但是,我们总是能做的更多,比如一个弹簧被用力压扁,当松开手的时候会反复弹动。使用上面的方式纵然可以实现这样的动画,但代码量复杂,也基本无复用性可言,可想而知会是糟糕的代码。因此,我们需要其他的动画方式,系统也正好提供了这样的一种动画供我们使用:

[js] view plain copy
  1. + (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  

照例科普一下额外的参数信息:

当一个圆角按钮高速移动的进入界面中,接着狠狠的震动,这绝对会狠狠地吸引住你的眼球。比如我尝试着让某个UICollectionView的分类按钮从屏幕下方弹入视图的时候;又或者我让这个小球弹到右下角,以提示用户该如何操作:

技术分享
小球弹出效果


这效果非常的棒,在看到这些小圆球之后,你本能的会想要去点击这些按钮,而这些小球弹出的动画仅仅需要下面这么几句代码:

[js] view plain copy
  1. CGPoint center = cell.center;  
  2. CGPoint startCenter = center;  
  3. startCenter.y += LXD_SCREEN_HEIGHT;  
  4. cell.center = startCenter;  
  5.   
  6. [UIView animateWithDuration: 0.5 delay: 0.35 * indexPath.item usingSpringWithDamping: 0.6 initialSpringVelocity: 0 options: UIViewAnimationOptionCurveLinear animations: ^{  
  7.     cell.center = center;  
  8. } completion: nil];  

除了这段弹出的代码,在小球被点击的时候,还会产生一个弹到右下角的动画,然后从左侧弹出列表。这非常的酷,因为不用额外的提示,用户会很自然的知道该怎么回到分组的界面 —— 点击一下右下角的圆形按钮。这是非常重要的,我们的动画应该不仅仅只是为了让界面更加的优雅漂亮,还应该能用以减少用户学习使用app的成本,这些都是动画的追求。

最后

相比起PC端的粗糙,移动端的应用需要更加精致,精致复杂的动画都是源于一个个简单的动画组合而成的。本文作为动画篇的第一篇博客,目的是为了从最简单的UIView动画讲起,慢慢的拓展其它的动画,也希望能起到抛砖引玉的作用。在文章的最后,如果你是iOS动画的初学者,请尝试结合上面提到的知识,为本文最开始的登录demo中添加代码,让按钮从下方渐变显示弹出:

技术分享
弹出的登录按钮

原文:http://blog.csdn.net/helloworld_junyang/article/details/51033870

评论(0
© 2014 bubuko.com 版权所有 - 联系我们:wmxa8@hotmail.com
打开技术之扣,分享程序人生!