动画是IOS开发过程中很重要的一块知识点,平移,旋转,翻转,改变透明度等,我们开发需求中时不时就会遇到,有时还会遇到更加复杂的动画需求,这就要求我们IOS开发者必须对动画知识点有一定的了解。
按照IOS动画的发展史和复杂程度,我给他们分为以下几部分。
1.事物动画
这是IOS动画最初面对UI层使用的动画,为什么我叫他事物动画大家看下代码就明白了。
事物动画实例代码2.普通的Block动画
相对于事物动画,代码结构看着更加美观,简单易用,链式调用,Block回调动画真正的内容,开发代码中几乎都是使用Block动画。
普通Block动画代码示例3.Spring-Block动画
这是IOS7.0以后加入的新特性,动画可以弹式跳动等新的特性。
usingSpringWithDamping就是代表弹式跳动,数值是[0,1];
initialSpringVeloccity代表初始化速度,数值也是[0,1];
Spring-Block动画4.UIView切换动画
一般用在UIView的出现在视图中或者消失在视图中的切换动画。
UIView切换动画5.Frames动画
这个类型的动画相对复杂度要高些,也是IOS7.0以后才有的动画内容。
帧动画的真正的动画内容其实是addKeyframeWithRelativeStartTime:代表相对于总动画开始以后的我这个分动画的相对开始时间,这就是帧动画每个分动画,所有这些分动画加载一起执行完成就是我们要执行的帧动画。
帧动画的实例代码6.属性动画CABaseAnimation
属性动画,其实是叫核心动画,但是我个人感觉叫属性动画会更贴切些,通过指定keyPath属性,来确定UIView要执行的动画的属性,比如位置position,path,posiion.x,transfor.rotation.y等,然后通过设置fromVlue和toValue来设置动画的起始值,然后把动画加入到UIView的layer中来执行动画。
属性动画其实内部包括两部分,视图显示部分和属性数据部分,我们能看到就是视图显示部分,大部分情况下我们看到只是假象并不是UIView真实情况,比如下面的例子,我们看着lable是停在了动画结束的地方end点的位置,其实我们看到的这只是lable躯壳,他的灵魂依然在start点的位置,如果我们给lable设置了点击事件,我们点击我们最后看到lable的位置end,lable并不会有反应,反而点击原来lable的start的位置会响应点击事件,因为移动过去的只是lable视图层,他的属性数据并没有移动,所以如果我们要想在end位置lable也有点击事件,必须该表属性数据让他跟视图层同步一样。
属性动画注:数据与显示的同步
虽然上面的代码removeOnCompletion=NO和fileMode=KCAFillModeForwards保证了动画视图层停止到了终点,没有回到动画的原点,但是这只是最后一帧,而且视觉效果也不算完美,这是因为数据层和视图显示层不同步导致的,此时的数据层还是动画前的数据,所以我们要更改数据层的数据让他跟视图层的数据同步,方法就是我们只给动画CABaseAnimation设置fromValue不设置toValue,而是直接把toValue的值设置给数据层,这样不但视图上更完美了,而且还使视图跟实际数据统一,不会导致视图显示的位置和响应点击事件的位置不一样的尴尬事件产生。实例代码如下:
UIView属性层数据和视图层数据同步我们可以扩展到任意的CAAnimation对象,比如CAKeyFrameAnimation和CABaseAnimation等。
以上是本人研究IOS动画的个人见解,难免会有纰漏,欢迎大神指点,也欢迎打赏关注。
以后有时间会添加CALayer及其子类的使用,比如CAShaperLayer,CATextLayer和CAGradientLayer等,如感兴趣请多多关注。
网友评论