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 获取全局单例对象 |