解析这个之前我们首先要先了解两个知识点:
1.UIView和CALayer的关系
UIView其实内部并没有我们想象的那么强大,他只是负责展示和响应交互事件的,而真正的图形绘制工作,全部是CALayer来完成的,其实CALayer并不属于UIKit架构,而是属于QuartzCore架构,他是一个专门负责图形绘制的工具类,而且是完全跨IOS和OS X平台的。我们之所以感觉不到CALayer的这个功能,是因为UIView在初始化的时候自己创建了一个内置的CALayer对象,然后UIView就变成了CALayer的全权代理了。
2.CAAnimation,CABaseAnimation的相关知识
这个其实就是IOS核心动画,但是说白了其实就是属性动画,它包括两个重要的部分一个是负责视图显示的presentLayer,一个是负责属性数据的modleLayer,后者是背后的指挥,前者是表面显示,CABaseAnimation有三个很重要的属性就是:1.keyPath:指定动画类型 其实就是view对应的属性名字 2.fromValue:动画的起始值 3.toValue:动画的结束值。
了解了上面的两个知识点后我们再说是如何封装Block动画的。
其实UIView的每个可动画的属性都对应着CALayer的一个属性,当我们给UIView该表它的属性值的时候,CALayer的一个delegate会判断actionForLayer: forKey:当这个方法返回CAAction对象的时候,因为delegate又持有UIView的一个对象,就会把这个CAAction转成一个CAAnimation对象添加到UIView中执行动画,当这个方法返回NSNull的时候,就表示不进行动画只是改变属性,现在大家很明白了,其实很简单,就是当是Block动画的时候,我们只要在block里面设置UIView的属性,上面的那个方法就返回CAAction对象,然后执行动画,如果在block外面,就返回NULL对象,就不做动画,一旦明白了原理就很简单了,其实Block动画的封装就是这么简单。