LOTAnimationView
继承自 LOTView
,其本质上还是 UIView
1 | // 关键字 @compatibility_alias 的意思是给一个类设置一个别名。这样就可以不用重构以前的类,直接使用新的名字替代原有的名字 |
LOTAnimationView
内含有数个构造类方法
1 | /// Load animation by name from the default bundle, Images are also loaded from the bundle |
这些方法最终调用 LOTComposition
类的对应方法,然后根据返回的 LOTComposition
对象初始化自己
1 | + (instancetype)animationNamed:(NSString *)animationName inBundle:(NSBundle *)bundle { |
LOTAnimationView 在使用 -initWithModel:inBundle:
初始化时做了四件事
1 | // 赋值 bundle |
_setupWithSceneModel:
1 | - (void)_setupWithSceneModel:(LOTComposition *)model { |
LOTComposition
继承自 NSObject
,负责 json 数据的解析。即将 json 串解析成 OC 对象,包含 json 的解析的所有模型对象。
1 | // 方法内部会先调用单例对象 LOTAnimationCache ,使用 animationName 去掉后.缀后作为 key, 获取已缓存的 LOTComposition 对象,如果获取到没有,才调用构造方法创建。创建完成后,也会加到缓存池中,并赋值 cacheKey 属性。直接使用 init... 方法或 +animationFromJSON: 方法则不会加入到缓存(因为不知道动画的名字) |
LOTComposition
类中最重要的内部方法为 -_mapFromJSON:withAssetBundle:
,用来解析 json 转化的 字典对象
1 | - (void)_mapFromJSON:(NSDictionary *)jsonDictionary withAssetBundle:(NSBundle *)bundle |
此方法中又包含两个对象 LOTAssetGroup
、LOTLayerGroup
分别用于存放LOTAsset
和LOTLayer
对象。二者都是通过 id :对象
的方式将子对象存储到字典中,方便之后取用。(LOTAsset
为id
字段,LOTLayer
为ind
)。内部还包含其他很多 model,总之,就是对应要解析的 json 字符串需要的各种模型。
###LOTAsset
含有资源的 id、名字、宽、高、文件子路径、包含的子图层等信息。
1 | NSString *referenceID; // 资源id ---id |
LOTLayer
1 | NSString *layerName; // 图层名字 ---nm |
LOTCompositionContainer
顾名思义,LOTCompositionContainer
是数据 LOTComposition
展示的控件,继承自 LOTLayerContainer
,进而继承自CALayer
。动画效果全部在这里实现。
LOTAnimationCache
继承自 NSObject
,单例对象,用于缓存加载过得 LOTComposition
对象。
内有两个对象animationsCache_
和lruOrderArray_
,分别存储缓存的LOTComposition
对象和 有先后顺序的key
1 | NSMutableDictionary *animationsCache_; |
提供的方法有:
1 | /// Global Cache 获取全局单例对象 |