UIImage imageNamed初始化流程
2019-04-24 16:20:42 0 举报
iOS平台,UIImage imageNamed方法内部的流程分析
作者其他创作
大纲/内容
写入UIImageAsset缓存表
首先根据name找到Bundle含有的对应图片路径数组_UIImageCollectImagePathsForPath()
解析成功?
否
是
判断当前图片是否保留矢量数据(Xcode 9以及iOS 11支持)
返回了空的UIImageAsset?
取lastPathComponent
惰性检查,若没创建,则通过路径创建CGImage_UIImageCreateImageAtPath()
通过CGPDFPageRef构造UIImage
通过Bundle取得对应的UIAssetManager
注:实际上在模拟器,你确实可以访问别的App的Bundle资源,但是真机不行
UIImage imageNamed:inBundle:compatibleWithTraitCollection:
注:每个Bundle有一个AssetManager管理
注:UIPathLazyImageAsset继承自UIImageAsset,提供了惰性访问,大概流程如下,比较直观
对产生的UIImage绑定UIImageAsset
name以/开头?
路径不为空?
UIIAssetManager newAssetNamed:fromBundle:
UIAssetManager imageNamed:withTrait:
调用Core UI框架的方法,解析Assets.car得到对应的CUINamedLayerStack
根据CGImageRef构造UIImage
根据文件名设置scale,计算imageOrientation
进一步检查是否是Bundle文件资源
直接取layer栈第一层的CUINamedImage
CGImageSourceCreateWithFile
注:之所以Core UI框架有一个Stack的概念,是因为跨平台框架,在macOS上可以允许多Layer图像,如TIFF格式,是通过多个NSImageRep叠加得到;iOS上每个CUINamedLayerStack只有一个Layer
根据traitCollection解析出具体一条路径
创建一个UIPathLazyImageAsset,赋值所有路径
加载失败
开始
访问imageWithTraitCollection获取一个UIImage
结束
返回一个CG-based的UIImage
UIImageAsset缓存表命中?
调用imageWithTraitCollection返回UIImage
首先检查Asset Catalog资源是否存在
检查路径是否在App Main Bundle下(*)
收藏
0 条评论
下一页