iOS魔法阵动画

        放假在家,看视频的时候不小心刷到了动画片,满满的童年记忆啊.记得光能使者里面的那个魔法阵啊,以前是多么喜欢,反正也是闲着,就用iOS的动画实现了下,一来满足下自己,二来嘛也相当于回顾这些动画相关的知识.先上图看看,大神请自动跳过,不喜勿喷.


成品

一.实现过程:

本着观察->拆解->实现的逻辑,简单分析下动画的过程.

1.外部的两个圆逆时针进行strokeEnd动画

2.第一个步骤走完了之后,行程五角星的六条线做了都做了一次strokeEnd和opacity动画,主要是用来进行第一次线条绘制,因为先进行了绘制线条,然后消失,使用了opacity动画

3.最后进行所有线条的绘制,保持不变

实现的过程很简单,使用CoreAnimation配合strokeEnd动画和opacity动画,只是在实现的时候对时间的控制和多个线条的绘制先后稍微有点麻烦.我的做法是,先计算出所有的线条上包含的主要的point,然后按照上面的步骤进行绘制,过程比较简单,所以,动画的实现过程不去讨论了,有同学感兴趣的话大家看下demo.今天主要想记录下自己在这个过程中遇到的问题.

二.问题

1.在实现的过程中,CoreAnimation动画属性的预先设置的值

针对这个问题,因为好长时间使用CoreAnimation没写这种过程稍微复杂的动画,所以在写的时候并没有在意.直到我实现的时候,出现了画线多次,opacity闪动多次的问题,我刚开始以为是因为没有设置removedOnCompletion,导致动画完成后自动恢复成动画之前的样子,后来发现并不是.代码修改之后发现,是因为动画初始值有问题.比如strokeEnd,我在创建CAShapeLayer的时候设置了其值为0.0,但是在动画完成之后,并没有变为1.0,还是保持了0.0,所以实现之后,线条马上就消失了,所以这边的修改是要么在初始的时候,要么在动画完成之后去修改,这是我的下下之策.

2.实现的时候,怎么在animationDidStop中区分多个动画.

这个问题其实说大不大,说小不小.之前做动画的时候,要么可以直接判断anim是否相等,要么进行使用KVC的方式.当时为了可以获取到完成动画的那个layer,我干脆写了一个category添加了layer和name,用来方便的获取当前的layer和区分当前完成动画的anim,但是效果并没有如我所料.animationDidStop中获取到的anim来获取这些属性的时候,一直都为nil,这让我很不解.打印了anim之后才发现,animationDidStop中获取的anim和创建的那个anim,原本的属性值都是相等的,但是内存地址却不相等,所以不管使用category还是直接判断anim是否相等的方式,全部都是不行的.个人猜测可能是新的SDK中对anim做了一次拷贝吧,因为之前貌似不是这样的.了解内情的小伙伴可以在评论中一起讨论下.so,最后只能使用KVC来做了,没有进一步去探究只是因为放假么马上要下去打球了,,,/(ㄒoㄒ)/~~

3.别忘了removedOnCompletion

有感兴趣的同学如果还看到什么有意思的动效,可以@我下,大家一起实现,还有针对我上面的问题,也可以在下面留言,相互学习

你可能感兴趣的:(iOS魔法阵动画)